{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "#PRW\n",
    "#这个colab里面需要补习的知识点：GraphSAGE和GAT的模型原理（尤其是attention机制）\n",
    "#model.train()    model.eval()    no_grad()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "XuXWJLEm2UWS"
   },
   "source": [
    "# **CS224W - Colab 3**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "8gzsP50bF6Gb"
   },
   "source": [
    "In Colab 2 we constructed GNN models by using PyTorch Geometric built in GCN layer, the `GCNConv`. In this Colab we will implement the **GraphSAGE** ([Hamilton et al. (2017)](https://arxiv.org/abs/1706.02216)) and **GAT** ([Veličković et al. (2018)](https://arxiv.org/abs/1710.10903)) layers directly. Then we will run our models on the CORA dataset, which is a standard citation network benchmark dataset.\n",
    "\n",
    "We will then use [DeepSNAP](https://snap.stanford.edu/deepsnap/), a Python library assisting efficient deep learning on graphs, to split the graphs in different settings and apply dataset transformations.\n",
    "\n",
    "At last, using DeepSNAP transductive link prediction split functionality, we will construct a simple GNN model on the edge property predition (link prediction) task.\n",
    "\n",
    "**Note**: Make sure to **sequentially run all the cells in each section**, so that the intermediate variables / packages will carry over to the next cell\n",
    "\n",
    "Have fun on Colab 3 :)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "id": "PRfgbfTjCRD_"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'1.6.3'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch_geometric\n",
    "torch_geometric.__version__"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ZoXlf4MtYrbz"
   },
   "source": [
    "# 1 GNN Layers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "TQy2RBfgYut4"
   },
   "source": [
    "## Implementing Layer Modules\n",
    "\n",
    "In colab 2, we implemented a network using GCN in node and graph classification tasks. However, the GCN module we used in colab 2 is from the official library. For this problem, we will provide you with a general Graph Neural Network Stack, where you'll be able to plugin your own modules of GraphSAGE and GATs. We will use our implementations to complete node classification on CORA, which is a standard citation network benchmark dataset. In this dataset, nodes correspond to documents and edges correspond to undirected citations. Each node has a class label. The node features are elements of a bag-or-words representation of a document. For the Cora dataset, there are 2708 nodes, 5429 edges, 7 prediction classes for nodes, and 1433 features per node. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "H4ne6Gw-CT5G"
   },
   "source": [
    "## GNN Stack Module\n",
    "\n",
    "Below is the implementation for a general GNN Module that could plugin any layers, including **GraphSage**, **GAT**, etc. This module is provided for you, and your own **GraphSage** and **GAT** layers will function as components in the GNNStack Module."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "id": "Ys8vZAFPCWWe"
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch_scatter\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "import torch_geometric.nn as pyg_nn\n",
    "import torch_geometric.utils as pyg_utils\n",
    "\n",
    "from torch import Tensor\n",
    "from typing import Union, Tuple, Optional\n",
    "from torch_geometric.typing import (OptPairTensor, Adj, Size, NoneType,\n",
    "                                    OptTensor)\n",
    "\n",
    "from torch.nn import Parameter, Linear\n",
    "#PRW：https://pytorch.org/docs/stable/generated/torch.nn.parameter.Parameter.html\n",
    "from torch_sparse import SparseTensor, set_diag\n",
    "from torch_geometric.nn.conv import MessagePassing\n",
    "from torch_geometric.utils import remove_self_loops, add_self_loops, softmax\n",
    "\n",
    "class GNNStack(torch.nn.Module):\n",
    "    def __init__(self, input_dim, hidden_dim, output_dim, args, emb=False):\n",
    "        super(GNNStack, self).__init__()\n",
    "        conv_model = self.build_conv_model(args.model_type)  #GraphSage / GAT\n",
    "        self.convs = nn.ModuleList()\n",
    "        self.convs.append(conv_model(input_dim, hidden_dim))\n",
    "        assert (args.num_layers >= 1), 'Number of layers is not >=1'\n",
    "        #Python assert（断言）用于判断一个表达式，在表达式条件为 false 的时候触发异常。\n",
    "        for l in range(args.num_layers-1):\n",
    "            self.convs.append(conv_model(args.heads * hidden_dim, hidden_dim))  \n",
    "            #PRW：下面GAT部分意思似乎是在这里做修改，但是我看这意思是已经改好了？不过其实我没看懂，等我以后回来再研究\n",
    "\n",
    "        # post-message-passing\n",
    "        self.post_mp = nn.Sequential(\n",
    "            nn.Linear(args.heads * hidden_dim, hidden_dim), nn.Dropout(args.dropout), \n",
    "            nn.Linear(hidden_dim, output_dim))\n",
    "\n",
    "        self.dropout = args.dropout\n",
    "        self.num_layers = args.num_layers\n",
    "\n",
    "        self.emb = emb\n",
    "\n",
    "    def build_conv_model(self, model_type):\n",
    "        if model_type == 'GraphSage':\n",
    "            return GraphSage\n",
    "        elif model_type == 'GAT':\n",
    "            # When applying GAT with num heads > 1, one needs to modify the \n",
    "            # input and output dimension of the conv layers (self.convs),\n",
    "            # to ensure that the input dim of the next layer is num heads\n",
    "            # multiplied by the output dim of the previous layer.\n",
    "            # HINT: In case you want to play with multiheads, you need to change the for-loop when builds up self.convs to be\n",
    "            # self.convs.append(conv_model(hidden_dim * num_heads, hidden_dim)), \n",
    "            # and also the first nn.Linear(hidden_dim * num_heads, hidden_dim) in post-message-passing.\n",
    "            return GAT\n",
    "        #PRW：大概理解就是如果heads大于1，卷积层的输入输出维度就都需要改成下一层输入维度是前一层输出维度乘heads\n",
    "        #这部分还没看懂，以后回来重看\n",
    "\n",
    "    def forward(self, data):\n",
    "        x, edge_index, batch = data.x, data.edge_index, data.batch\n",
    "          \n",
    "        for i in range(self.num_layers):\n",
    "            x = self.convs[i](x, edge_index)\n",
    "            x = F.relu(x)\n",
    "            x = F.dropout(x, p=self.dropout)\n",
    "\n",
    "        x = self.post_mp(x)\n",
    "\n",
    "        if self.emb == True:\n",
    "            return x\n",
    "\n",
    "        return F.log_softmax(x, dim=1)\n",
    "    #Applies a softmax followed by a logarithm.\n",
    "    #https://pytorch.org/docs/stable/nn.functional.html#torch.nn.functional.log_softmax\n",
    "\n",
    "    def loss(self, pred, label):\n",
    "        return F.nll_loss(pred, label)    \n",
    "    #The negative log likelihood loss.\n",
    "    #https://pytorch.org/docs/stable/_modules/torch/nn/functional.html#nll_loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[[-0.0865,  0.1741, -0.0227],\n",
      "         [ 1.2644, -1.2028,  0.1233]]])\n",
      "tensor([[[-1.5813, -0.2250, -0.7688],\n",
      "         [-0.2303, -1.6019, -0.6228]]])\n"
     ]
    }
   ],
   "source": [
    "#PRW\n",
    "eg_ls=nn.LogSoftmax(dim=1)  #dim值是必须要的\n",
    "eg_tensor=torch.randn(1,2,3)\n",
    "eg_result=eg_ls(eg_tensor)\n",
    "print(eg_tensor)\n",
    "print(eg_result)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "syDtxjxoCZgq"
   },
   "source": [
    "## GraphSage Implementation\n",
    "\n",
    "Now let's start working on our own implementation of layers! This part is to get you familiar with how to implement Pytorch layer based on Message Passing. You will be implementing the **forward**, **message** and **aggregate** functions.\n",
    "\n",
    "Generally, the **forward** function is where the actual message passing is conducted. All logic in each iteration happens in **forward**, where we'll call **propagate** function to propagate information from neighbor nodes to central nodes.  So the general paradigm will be pre-processing -> propagate -> post-processing.\n",
    "\n",
    "Recall the process of message passing we introduced in homework 1. **propagate** further calls **message** which transforms information of neighbor nodes into messages, **aggregate** which aggregates all messages from neighbor nodes into one, and **update** which further generates the embedding for nodes in the next iteration.\n",
    "\n",
    "Our implementation is slightly variant from this, where we'll not explicitly implement **update**, but put the logic for updating nodes in **forward** function. To be more specific, after information is propagated, we can further conduct some operations on the output of **propagate**. The output of **forward** is exactly the embeddings after the current iteration.\n",
    "\n",
    "In addition, tensors passed to **propagate()** can be mapped to the respective nodes $i$ and $j$ by appending _i or _j to the variable name, .e.g. x_i and x_j. Note that we generally refer to $i$ as the central nodes that aggregates information, and refer to $j$ as the neighboring nodes, since this is the most common notation.\n",
    "\n",
    "Please find more details in the comments. One thing to note is that we're adding **skip connections** to our GraphSage. Formally, the update rule for our model is described as below:\n",
    "\n",
    "\\begin{equation}\n",
    "h_v^{(l)} = W_l\\cdot h_v^{(l-1)} + W_r \\cdot AGG(\\{h_u^{(l-1)}, \\forall u \\in N(v) \\})\n",
    "\\end{equation}\n",
    "\n",
    "For simplicity, we use mean aggregations where:\n",
    "\n",
    "\\begin{equation}\n",
    "AGG(\\{h_u^{(l-1)}, \\forall u \\in N(v) \\}) = \\frac{1}{|N(v)|} \\sum_{u\\in N(v)} h_u^{(l-1)}\n",
    "\\end{equation}\n",
    "\n",
    "Additionally, $\\ell$-2 normalization is applied after each iteration.\n",
    "\n",
    "In order to complete the work correctly, we have to understand how the different functions interact with each other. In **propagate** we can pass in any parameters we want. For example, we pass in $x$ as an parameter:\n",
    "\n",
    "... = propagate(..., $x$=($x_{central}$, $x_{neighbor}$), ...)\n",
    "\n",
    "Here $x_{central}$ and $x_{neighbor}$ represent the features from **central** nodes and from **neighbor** nodes. If we're using the same representations from central and neighbor, then $x_{central}$ and $x_{neighbor}$ could be identical.\n",
    "\n",
    "Suppose $x_{central}$ and $x_{neighbor}$ are both of shape N * d, where N is number of nodes, and d is dimension of features.\n",
    "\n",
    "Then in message function, we can take parameters called $x\\_i$ and $x\\_j$. Usually $x\\_i$ represents \"central nodes\", and $x\\_j$ represents \"neighbor nodes\". Pay attention to the shape here: $x\\_i$ and $x\\_j$ are both of shape E * d (**not N!**). $x\\_i$ is obtained by concatenating the embeddings of central nodes of all edges through lookups from $x_{central}$ we passed in propagate. Similarly, $x\\_j$ is obtained by concatenating the embeddings of neighbor nodes of all edges through lookups from $x_{neighbor}$ we passed in propagate.\n",
    "\n",
    "Let's look at an example. Suppose we have 4 nodes, so $x_{central}$ and $x_{neighbor}$ are of shape 4 * d. We have two edges (1, 2) and (3, 0). Thus, $x\\_i$ is obtained by $[x_{central}[1]^T; x_{central}[3]^T]^T$, and $x\\_j$ is obtained by $[x_{neighbor}[2]^T; x_{neighbor}[0]^T]^T$\n",
    "\n",
    "<font color='red'>For the following questions, DON'T refer to any existing implementations online.</font>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "  \n",
    "PRW对上面这一坨内容中除GraphSAGE外内容的笔记（从有道云笔记上截图的我自己的笔记）\n",
    "![p1](cs224w-colab3-1.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上面提及的PyG文档是指在下面写GraphSAGE层时用到的create_gnn的网址：[https://pytorch-geometric.readthedocs.io/en/latest/notes/create_gnn.html](https://pytorch-geometric.readthedocs.io/en/latest/notes/create_gnn.html)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "GraphSAGE的message就是原信号；aggregate作两步，先聚合邻居信息（𝐴𝐺𝐺({ℎ(𝑙−1)𝑢,∀𝑢∈𝑁(𝑣)})）（在aggregate实现）；再将邻居总信息和上一层本节点信息聚合起来（𝑊𝑙⋅ℎ(𝑙−1)𝑣+𝑊𝑟⋅𝐴𝐺𝐺({ℎ(𝑙−1)𝑢,∀𝑢∈𝑁(𝑣)})）（在forward实现）  \n",
    "（图片截自cs224w官方slides）\n",
    "![p2](cs224w-colab3-2.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "colab": {
     "background_save": true
    },
    "id": "RwG4HqCFCaOD"
   },
   "outputs": [],
   "source": [
    "class GraphSage(MessagePassing):\n",
    "    \n",
    "    def __init__(self, in_channels, out_channels, normalize = True,\n",
    "                 bias = False, **kwargs):  \n",
    "        super(GraphSage, self).__init__(**kwargs)\n",
    "\n",
    "        self.in_channels = in_channels\n",
    "        self.out_channels = out_channels\n",
    "        self.normalize = normalize\n",
    "\n",
    "        self.lin_l = None\n",
    "        self.lin_r = None\n",
    "\n",
    "        ############################################################################\n",
    "        # TODO: Your code here! \n",
    "        # Define the layers needed for the message and update functions below.\n",
    "        # self.lin_l is the linear transformation that you apply to embedding \n",
    "        #            for central node.\n",
    "        # self.lin_r is the linear transformation that you apply to aggregated \n",
    "        #            message from neighbors.\n",
    "        # Our implementation is ~2 lines, but don't worry if you deviate from this.\n",
    "        self.lin_l=Linear(in_channels,out_channels)  #Wl\n",
    "        self.lin_r=Linear(in_channels,out_channels)  #Wr\n",
    "\n",
    "        ############################################################################\n",
    "\n",
    "        self.reset_parameters()\n",
    "\n",
    "    def reset_parameters(self):\n",
    "        self.lin_l.reset_parameters()\n",
    "        self.lin_r.reset_parameters()\n",
    "\n",
    "    def forward(self, x, edge_index, size = None):\n",
    "        \"\"\"\"\"\"\n",
    "\n",
    "        out = None\n",
    "\n",
    "        ############################################################################\n",
    "        # TODO: Your code here! \n",
    "        # Implement message passing, as well as any post-processing (our update rule).\n",
    "        # 1. First call propagate function to conduct the message passing.\n",
    "        #    1.1 See there for more information: \n",
    "        #        https://pytorch-geometric.readthedocs.io/en/latest/notes/create_gnn.html\n",
    "        #    1.2 We use the same representations for central (x_central) and \n",
    "        #        neighbor (x_neighbor) nodes, which means you'll pass x=(x, x) \n",
    "        #        to propagate.\n",
    "        # 2. Update our node embedding with skip connection.\n",
    "        # 3. If normalize is set, do L-2 normalization (defined in \n",
    "        #    torch.nn.functional)\n",
    "        # Our implementation is ~5 lines, but don't worry if you deviate from this.\n",
    "        out=self.propagate(edge_index,x=(x,x),size=size)\n",
    "        x=self.lin_l(x)\n",
    "        out=self.lin_r(out)\n",
    "        out=out+x\n",
    "        if self.normalize:\n",
    "            out=F.normalize(out)\n",
    "\n",
    "        ############################################################################\n",
    "\n",
    "        return out\n",
    "\n",
    "    def message(self, x_j):\n",
    "\n",
    "        out = None\n",
    "\n",
    "        ############################################################################\n",
    "        # TODO: Your code here! \n",
    "        # Implement your message function here.\n",
    "        # Our implementation is ~1 lines, but don't worry if you deviate from this.\n",
    "        out=x_j\n",
    "\n",
    "        ############################################################################\n",
    "\n",
    "        return out\n",
    "\n",
    "    def aggregate(self, inputs, index, dim_size = None):\n",
    "\n",
    "        out = None\n",
    "\n",
    "        # The axis along which to index number of nodes.\n",
    "        node_dim = self.node_dim  #node_dim的情况可以看PyG那个文档，是MessagePassing的参数：indicates along which axis to propagate.\n",
    "\n",
    "        ############################################################################\n",
    "        # TODO: Your code here! \n",
    "        # Implement your aggregate function here.\n",
    "        # See here as how to use torch_scatter.scatter: \n",
    "        # https://pytorch-scatter.readthedocs.io/en/latest/functions/scatter.html#torch_scatter.scatter\n",
    "        # Our implementation is ~1 lines, but don't worry if you deviate from this.\n",
    "        out=torch_scatter.scatter(inputs,index,node_dim,dim_size=dim_size,reduce='mean')\n",
    "\n",
    "        ############################################################################\n",
    "\n",
    "        return out\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "qjcfF3RACdLD"
   },
   "source": [
    "## GAT Implementation\n",
    "\n",
    "Attention mechanisms have become the state-of-the-art in many sequence-based tasks such as machine translation and learning sentence representations. One of the major benefits of attention-based mechanisms is their ability to focus on the most relevant parts of the input to make decisions. In this problem, we will see how attention mechanisms can be used to perform node classification of graph-structured data through the usage of Graph Attention Networks (GATs).\n",
    "\n",
    "The building block of the Graph Attention Network is the graph attention layer, which is a variant of the aggregation function . Let $N$ be the number of nodes and $F$ be the dimension of the feature vector for each node. The input to each graph attentional layer is a set of node features: $\\mathbf{h} = \\{\\overrightarrow{h_1}, \\overrightarrow{h_2}, \\dots, \\overrightarrow{h_N}$\\}, $\\overrightarrow{h_i} \\in R^F$. The output of each graph attentional layer is a new set of node features, which may have a new dimension $F'$: $\\mathbf{h'} = \\{\\overrightarrow{h_1'}, \\overrightarrow{h_2'}, \\dots, \\overrightarrow{h_N'}\\}$, with $\\overrightarrow{h_i'} \\in \\mathbb{R}^{F'}$.\n",
    "\n",
    "We will now describe this transformation of the input features into higher-level features performed by each graph attention layer. First, a shared linear transformation parametrized by the weight matrix $\\mathbf{W} \\in \\mathbb{R}^{F' \\times F}$ is applied to every node. Next, we perform self-attention on the nodes. We use a shared attentional mechanism:\n",
    "\\begin{equation} \n",
    "a : \\mathbb{R}^{F'} \\times \\mathbb{R}^{F'} \\rightarrow \\mathbb{R}.\n",
    "\\end{equation}\n",
    "\n",
    "This mechanism computes the attention coefficients that capture the importance of node $j$'s features to node $i$:\n",
    "\\begin{equation}\n",
    "e_{ij} = a(\\mathbf{W_l}\\overrightarrow{h_i}, \\mathbf{W_r} \\overrightarrow{h_j})\n",
    "\\end{equation}\n",
    "The most general formulation of self-attention allows every node to attend to all other nodes which drops all structural information. To utilize graph structure in the attention mechanisms, we can use masked attention. In masked attention, we only compute $e_{ij}$ for nodes $j \\in \\mathcal{N}_i$ where $\\mathcal{N}_i$ is some neighborhood of node $i$ in the graph.\n",
    "\n",
    "To easily compare coefficients across different nodes, we normalize the coefficients across $j$ using a softmax function:\n",
    "\\begin{equation}\n",
    "\\alpha_{ij} = \\text{softmax}_j(e_{ij}) = \\frac{\\exp(e_{ij})}{\\sum_{k \\in \\mathcal{N}_i} \\exp(e_{ik})}\n",
    "\\end{equation}\n",
    "\n",
    "For this problem, our attention mechanism $a$ will be a single-layer feedforward neural network parametrized by a weight vector $\\overrightarrow{a} \\in \\mathbb{R}^{F'}$, followed by a LeakyReLU nonlinearity (with negative input slope 0.2). Let $\\cdot^T$ represent transposition and $||$ represent concatenation. The coefficients computed by our attention mechanism may be expressed as:\n",
    "\n",
    "\\begin{equation}\n",
    "\\alpha_{ij} = \\frac{\\exp\\Big(\\text{LeakyReLU}\\Big(\\overrightarrow{a_l}^T \\mathbf{W_l} \\overrightarrow{h_i} + \\overrightarrow{a_r}^T\\mathbf{W_r}\\overrightarrow{h_j}\\Big)\\Big)}{\\sum_{k\\in \\mathcal{N}_i} \\exp\\Big(\\text{LeakyReLU}\\Big(\\overrightarrow{a_l}^T \\mathbf{W_l} \\overrightarrow{h_i} + \\overrightarrow{a_r}^T\\mathbf{W_r}\\overrightarrow{h_k}\\Big)\\Big)}\n",
    "\\end{equation}\n",
    "\n",
    "For the following questions, we denote $\\alpha_l = [...,\\overrightarrow{a_l}^T \\mathbf{W_l} \\overrightarrow{h_i},...]$ and $\\alpha_r = [..., \\overrightarrow{a_r}^T \\mathbf{W_r} \\overrightarrow{h_j}, ...]$.\n",
    "\n",
    "\n",
    "At every layer of GAT, after the attention coefficients are computed for that layer, the aggregation function can be computed by a weighted sum of neighborhood messages, where weights are specified by $\\alpha_{ij}$.\n",
    "\n",
    "Now, we use the normalized attention coefficients to compute a linear combination of the features corresponding to them. These aggregated features will serve as the final output features for every node.\n",
    "\n",
    "\\begin{equation}\n",
    "h_i' = \\sum_{j \\in \\mathcal{N}_i} \\alpha_{ij} \\mathbf{W_r} \\overrightarrow{h_j}.\n",
    "\\end{equation}\n",
    "\n",
    "To stabilize the learning process of self-attention, we use multi-head attention. To do this we use $K$ independent attention mechanisms, or ``heads'' compute output features as in the above equations. Then, we concatenate these output feature representations:\n",
    "\n",
    "\\begin{equation}\n",
    "    \\overrightarrow{h_i}' = ||_{k=1}^K \\Big(\\sum_{j \\in \\mathcal{N}_i} \\alpha_{ij}^{(k)} \\mathbf{W_r}^{(k)} \\overrightarrow{h_j}\\Big)\n",
    "\\end{equation}\n",
    "\n",
    "where $||$ is concentation, $\\alpha_{ij}^{(k)}$ are the normalized attention coefficients computed by the $k$-th attention mechanism $(a^k)$, and $\\mathbf{W}^{(k)}$ is the corresponding input linear transformation's weight matrix. Note that for this setting, $\\mathbf{h'} \\in \\mathbb{R}^{KF'}$."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "PRW的GAT笔记：  \n",
    "GAT的graph attention layer是aggregation function的一种变体  \n",
    "W是graph attention layer的weight marix  \n",
    "a是共享的注意力机制、将两两节点对应特征进行操作后映射到标量上  \n",
    "$e_{ij}$是attention coefficient，是对i（中心）和j（邻居）节点信息经过W后进行a操作的结果，衡量j的特征对i的重要性  \n",
    "为了在注意力机制中应用图结构，使用masked attention让$e_{ij}$只能获取邻居之间的信息。  \n",
    "为了比较不同节点上的coefficient，对$e_{ij}$作softmax  \n",
    "在本代码中，a是一个以LeakyReLU作非线性化，以$\\overrightarrow{a} \\in \\mathbb{R}^{F'}$为weight matrix的单层前馈神经网络。最终的计算机制就是如最长那个公式所示  \n",
    "特征通过α和W聚合  \n",
    "多头注意力：多做几个attention机制然后聚合起来"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "colab": {
     "background_save": true
    },
    "id": "w4j45gTpCeXO"
   },
   "outputs": [],
   "source": [
    "class GAT(MessagePassing):\n",
    "\n",
    "    def __init__(self, in_channels, out_channels, heads = 2,\n",
    "                 negative_slope = 0.2, dropout = 0., **kwargs):\n",
    "        super(GAT, self).__init__(node_dim=0, **kwargs)\n",
    "\n",
    "        self.in_channels = in_channels\n",
    "        self.out_channels = out_channels\n",
    "        self.heads = heads\n",
    "        self.negative_slope = negative_slope\n",
    "        self.dropout = dropout\n",
    "\n",
    "        self.lin_l = None\n",
    "        self.lin_r = None\n",
    "        self.att_l = None\n",
    "        self.att_r = None\n",
    "\n",
    "        ############################################################################\n",
    "        # TODO: Your code here! \n",
    "        # Define the layers needed for the message functions below.\n",
    "        # self.lin_l is the linear transformation that you apply to embeddings \n",
    "        # BEFORE message passing.\n",
    "        # Pay attention to dimensions of the linear layers, since we're using \n",
    "        # multi-head attention.\n",
    "        # Our implementation is ~1 lines, but don't worry if you deviate from this.\n",
    "        self.lin_l=Linear(in_channels,heads*out_channels)  #W_l  这里的in_channels就是已经乘过heads的数字\n",
    "        #print(self.lin_l)\n",
    "\n",
    "        ############################################################################\n",
    "\n",
    "        self.lin_r = self.lin_l  #W_r\n",
    "        #print(self.lin_r)\n",
    "\n",
    "        ############################################################################\n",
    "        # TODO: Your code here! \n",
    "        # Define the attention parameters \\overrightarrow{a_l/r}^T in the above intro.\n",
    "        # You have to deal with multi-head scenarios.\n",
    "        # Use nn.Parameter instead of nn.Linear\n",
    "        # Our implementation is ~2 lines, but don't worry if you deviate from this.\n",
    "        self.att_l = Parameter(torch.Tensor(1, heads, out_channels))  #a_l\n",
    "        self.att_r = Parameter(torch.Tensor(1, heads, out_channels))  #a_r\n",
    "        #Tensor(*sizes)\n",
    "\n",
    "        ############################################################################\n",
    "\n",
    "        self.reset_parameters()\n",
    "\n",
    "    def reset_parameters(self):\n",
    "        nn.init.xavier_uniform_(self.lin_l.weight)\n",
    "        nn.init.xavier_uniform_(self.lin_r.weight)\n",
    "        nn.init.xavier_uniform_(self.att_l)\n",
    "        nn.init.xavier_uniform_(self.att_r)\n",
    "        #https://pytorch.org/docs/stable/_modules/torch/nn/init.html#xavier_uniform_\n",
    "\n",
    "    def forward(self, x, edge_index, size = None):\n",
    "        \n",
    "        H, C = self.heads, self.out_channels\n",
    "\n",
    "        ############################################################################\n",
    "        # TODO: Your code here! \n",
    "        # Implement message passing, as well as any pre- and post-processing (our update rule).\n",
    "        # 1. First apply linear transformation to node embeddings, and split that \n",
    "        #    into multiple heads. We use the same representations for source and\n",
    "        #    target nodes, but apply different linear weights (W_l and W_r)\n",
    "        # 2. Calculate alpha vectors for central nodes (alpha_l) and neighbor nodes (alpha_r).\n",
    "        # 3. Call propagate function to conduct the message passing. \n",
    "        #    3.1 Remember to pass alpha = (alpha_l, alpha_r) as a parameter.\n",
    "        #    3.2 See there for more information: https://pytorch-geometric.readthedocs.io/en/latest/notes/create_gnn.html\n",
    "        # 4. Transform the output back to the shape of N * d.  #PRW：这个d又是啥……\n",
    "        # Our implementation is ~5 lines, but don't worry if you deviate from this.\n",
    "        x_l=self.lin_l(x)  #𝐖𝐥ℎ𝑖\n",
    "        x_r=self.lin_r(x)  #𝐖rℎj\n",
    "        x_l=x_l.view(-1,H,C)  #N x H x C\n",
    "        x_r=x_r.view(-1,H,C)\n",
    "        alpha_l = (x_l * self.att_l).sum(axis=1)  #*是逐元素相乘（每个特征对应的所有节点一样处理？）。sum的维度是H（聚合）。\n",
    "        #最终维度是N*C？\n",
    "        #alpha_l就是a^T * Wl * hi\n",
    "        alpha_r = (x_r * self.att_r).sum(axis=1)\n",
    "        out = self.propagate(edge_index, x=(x_l, x_r), alpha=(alpha_l, alpha_r),size=size)\n",
    "        out = out.view(-1, H * C)  #N*D(D=H*C)\n",
    "        #print(list(self.lin_l.parameters()))\n",
    "        #print(list(self.lin_r.parameters()))\n",
    "        #print(list(self.lin_l.parameters())==list(self.lin_r.parameters()))\n",
    "        \n",
    "        #print(hash(self.lin_l))\n",
    "        #print(hash(self.lin_r))\n",
    "        #这几行注释是给下一个cell用的，目的是看一下lin_l和lin_r这两层是不是真的一样（按照浅拷贝的定义来讲就应该一样）\n",
    "        #用id也行……哎这个辨别的方式倒是很多啦无所谓\n",
    "        \n",
    "        #然后我发现真的一样……但是似乎本意又应该是不一样？\n",
    "        #但是torch_geometric的GAT实现又确实也是这么写的：https://pytorch-geometric.readthedocs.io/en/latest/_modules/torch_geometric/nn/conv/gat_conv.html\n",
    "        #如果in_channels是一个数就一样，如果是一堆数就不一样？震惊，这是为什么呢？\n",
    "        #以后再回来研究\n",
    "\n",
    "        ############################################################################\n",
    "\n",
    "        return out\n",
    "\n",
    "\n",
    "    def message(self, x_j, alpha_j, alpha_i, index, ptr, size_i):\n",
    "\n",
    "        ############################################################################\n",
    "        # TODO: Your code here! \n",
    "        # Implement your message function. Putting the attention in message \n",
    "        # instead of in update is a little tricky.\n",
    "        # 1. Calculate the final attention weights using alpha_i and alpha_j,\n",
    "        #    and apply leaky Relu.\n",
    "        # 2. Calculate softmax over the neighbor nodes for all the nodes. Use \n",
    "        #    torch_geometric.utils.softmax instead of the one in Pytorch.\n",
    "        # 3. Apply dropout to attention weights (alpha).\n",
    "        # 4. Multiply embeddings and attention weights. As a sanity check, the output\n",
    "        #    should be of shape E * H * d.  #PRW：E是什么？N吗？\n",
    "        # 5. ptr (LongTensor, optional): If given, computes the softmax based on\n",
    "        #    sorted inputs in CSR representation. You can simply pass it to softmax.  #PRW：这个代码里就没给ptr留位置啊\n",
    "        # Our implementation is ~5 lines, but don't worry if you deviate from this.\n",
    "        \n",
    "        #alpha：[E, C]\n",
    "        alpha = alpha_i + alpha_j  #leakyrelu的对象\n",
    "        alpha = F.leaky_relu(alpha,self.negative_slope)\n",
    "        alpha = softmax(alpha, index, ptr, size_i)\n",
    "        #https://pytorch-geometric.readthedocs.io/en/latest/modules/utils.html#torch-geometric-utils\n",
    "        #https://github.com/rusty1s/pytorch_geometric/blob/master/torch_geometric/utils/softmax.py\n",
    "        #没仔细看，反正参数是这些参数\n",
    "        \n",
    "        alpha = F.dropout(alpha, p=self.dropout, training=self.training).unsqueeze(1)  #[E,1,C]\n",
    "        out = x_j * alpha  #通过计算得到的alpha来计算节点信息聚合值（我大概理解就是得到h_i^'）  #[E,H,C]\n",
    "\n",
    "        ############################################################################\n",
    "\n",
    "        return out\n",
    "\n",
    "\n",
    "    def aggregate(self, inputs, index, dim_size = None):\n",
    "\n",
    "        ############################################################################\n",
    "        # TODO: Your code here! \n",
    "        # Implement your aggregate function here.\n",
    "        # See here as how to use torch_scatter.scatter: https://pytorch-scatter.readthedocs.io/en/latest/_modules/torch_scatter/scatter.html\n",
    "        # Pay attention to \"reduce\" parameter is different from that in GraphSage.\n",
    "        # Our implementation is ~1 lines, but don't worry if you deviate from this.\n",
    "        out = torch_scatter.scatter(inputs, index, dim=self.node_dim, dim_size=dim_size, reduce='sum')\n",
    "\n",
    "        ############################################################################\n",
    "    \n",
    "        return out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Batch(batch=[2708], edge_index=[2, 10556], test_mask=[2708], train_mask=[2708], val_mask=[2708], x=[2708, 1433], y=[2708])\n"
     ]
    }
   ],
   "source": [
    "#PRW\n",
    "#lin_l和lin_r是同一个吗？\n",
    "from torch_geometric.datasets import Planetoid\n",
    "from torch_geometric.data import DataLoader\n",
    "dataset = Planetoid(root='/tmp/cora', name='Cora')\n",
    "eg_model=GAT(dataset.num_node_features,2)\n",
    "loader = DataLoader(dataset, batch_size=32, shuffle=True)\n",
    "for batch in loader:\n",
    "    print(batch)\n",
    "    op=eg_model(batch.x,batch.edge_index)\n",
    "    break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[[-0.0865,  0.1741, -0.0227],\n",
      "         [ 1.2644, -1.2028,  0.1233]]])\n",
      "tensor([[0.0648, 0.1849]])\n",
      "torch.Size([1, 2])\n"
     ]
    }
   ],
   "source": [
    "#PRW\n",
    "print(eg_tensor)\n",
    "eg_result2=eg_tensor.sum(dim=-1)\n",
    "print(eg_result2)\n",
    "print(eg_result2.size())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([2, 1, 1])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#PRW\n",
    "eg_result2.view(-1,1,1).size()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1, 1, 2])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#PRW\n",
    "eg_result2.unsqueeze(1).size()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "V2dkgSuWCheU"
   },
   "source": [
    "## Building Optimizers\n",
    "\n",
    "This function has been implemented for you. **For grading purposes please use the default Adam optimizer**, but feel free to play with other types of optimizers on your own."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "id": "f_TIQ8NPCjBP"
   },
   "outputs": [],
   "source": [
    "import torch.optim as optim\n",
    "\n",
    "def build_optimizer(args, params):\n",
    "    weight_decay = args.weight_decay\n",
    "    filter_fn = filter(lambda p : p.requires_grad, params)\n",
    "    if args.opt == 'adam':\n",
    "        optimizer = optim.Adam(filter_fn, lr=args.lr, weight_decay=weight_decay)\n",
    "    elif args.opt == 'sgd':\n",
    "        optimizer = optim.SGD(filter_fn, lr=args.lr, momentum=0.95, weight_decay=weight_decay)\n",
    "    elif args.opt == 'rmsprop':\n",
    "        optimizer = optim.RMSprop(filter_fn, lr=args.lr, weight_decay=weight_decay)\n",
    "    elif args.opt == 'adagrad':\n",
    "        optimizer = optim.Adagrad(filter_fn, lr=args.lr, weight_decay=weight_decay)\n",
    "    if args.opt_scheduler == 'none':\n",
    "        return None, optimizer\n",
    "    elif args.opt_scheduler == 'step':\n",
    "        scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=args.opt_decay_step, gamma=args.opt_decay_rate)\n",
    "    elif args.opt_scheduler == 'cos':\n",
    "        scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=args.opt_restart)\n",
    "    return scheduler, optimizer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "hBYdWFwYCkwY"
   },
   "source": [
    "## Training and Testing\n",
    "\n",
    "Here we provide you with the functions to train and test. **Please do not modify this part for grading purposes.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "id": "_tZMWRc8CmGg"
   },
   "outputs": [],
   "source": [
    "import time\n",
    "\n",
    "import networkx as nx\n",
    "import numpy as np\n",
    "import torch\n",
    "import torch.optim as optim\n",
    "\n",
    "from torch_geometric.datasets import TUDataset\n",
    "from torch_geometric.datasets import Planetoid\n",
    "from torch_geometric.data import DataLoader\n",
    "\n",
    "import torch_geometric.nn as pyg_nn\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "def train(dataset, args):\n",
    "    \n",
    "    print(\"Node task. test set size:\", np.sum(dataset[0]['train_mask'].numpy()))\n",
    "    test_loader = loader = DataLoader(dataset, batch_size=args.batch_size, shuffle=True)\n",
    "\n",
    "    # build model\n",
    "    model = GNNStack(dataset.num_node_features, args.hidden_dim, dataset.num_classes, \n",
    "                            args)\n",
    "    scheduler, opt = build_optimizer(args, model.parameters())\n",
    "\n",
    "    # train\n",
    "    losses = []\n",
    "    test_accs = []\n",
    "    for epoch in range(args.epochs):\n",
    "        total_loss = 0\n",
    "        model.train()\n",
    "        for batch in loader:\n",
    "            opt.zero_grad()\n",
    "            pred = model(batch)\n",
    "            label = batch.y\n",
    "            pred = pred[batch.train_mask]\n",
    "            label = label[batch.train_mask]\n",
    "            loss = model.loss(pred, label)\n",
    "            loss.backward()\n",
    "            opt.step()\n",
    "            total_loss += loss.item() * batch.num_graphs\n",
    "        total_loss /= len(loader.dataset)\n",
    "        losses.append(total_loss)\n",
    "\n",
    "        if epoch % 10 == 0:\n",
    "          test_acc = test(test_loader, model)\n",
    "          test_accs.append(test_acc)\n",
    "        else:\n",
    "          test_accs.append(test_accs[-1])\n",
    "    return test_accs, losses\n",
    "\n",
    "def test(loader, model, is_validation=True):\n",
    "    model.eval()\n",
    "\n",
    "    correct = 0\n",
    "    for data in loader:\n",
    "        with torch.no_grad():\n",
    "            # max(dim=1) returns values, indices tuple; only need indices\n",
    "            pred = model(data).max(dim=1)[1]\n",
    "            label = data.y\n",
    "\n",
    "        mask = data.val_mask if is_validation else data.test_mask\n",
    "        # node classification: only evaluate on nodes in test set\n",
    "        pred = pred[mask]\n",
    "        label = data.y[mask]\n",
    "            \n",
    "        correct += pred.eq(label).sum().item()\n",
    "\n",
    "    total = 0\n",
    "    for data in loader.dataset:\n",
    "        total += torch.sum(data.val_mask if is_validation else data.test_mask).item()\n",
    "    return correct / total\n",
    "  \n",
    "class objectview(object):\n",
    "    def __init__(self, d):\n",
    "        self.__dict__ = d\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "L7-h7jIsCns4"
   },
   "source": [
    "## Let's Start the Training!\n",
    "\n",
    "We will be working on the CORA dataset on node-level classification.\n",
    "\n",
    "This part is implemented for you. **For grading purposes, please do not modify the default parameters.** However, feel free to play with different configurations just for fun!\n",
    "\n",
    "**Submit your best accuracy and loss on Gradescope.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "id": "qe9B45l9Cpz2"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Node task. test set size: 140\n",
      "Maximum accuracy: 0.756\n",
      "Minimum loss: 0.10536009818315506\n",
      "Node task. test set size: 140\n",
      "Maximum accuracy: 0.754\n",
      "Minimum loss: 0.031098222360014915\n"
     ]
    },
    {
     "data": {
      "image/png": "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HGPv3r0MHDiQDh068MYbbwBw6tQpIiIiMBgMAERERNCmjW2/+JqOsW3bNof3//TTTxMXFwfYLkBPP/00vXr1IiEhgffee69en0F9uCxz3VwIIYYQ0trdz9fH3uXT/21mYt/+TT0khY/w53/vYW9Wwy4069YmmOm3dK+x/KWXXuKnn34iIyMDgHXr1rFz505++uknx7K6efPmER4eTmlpKb169WLkyJG0aNHCpZ8DBw6wcOFC5s6dy6hRo/jqq6+455573I4XERHBzp07efvtt3n11Vd5//33+fOf/8ygQYOYOnUq3333HR988EGt57Rjxw7mz5/Pli1bkFLSp08fBgwYwOHDh2nTpg3ffvstAPn5+eTm5rJ48WL279+PEKLOUJMzBQUFFBUV1bq8sLi4mD59+vD3v/8dgG7dujFt2jQAxo4dy7Jly7jlllsAKCkpISMjg/Xr1/P73/+en376CYD9+/ezdu1aCgsL6dy5M5MmTWLYsGHMnDmTTp06MWTIEO68804GDBgAwOTJkz0eY9y4ccydO5drr72WKVOmOMb4wQcfEBISwrZt2ygvL6dfv34MGzasXssmvcVnPHqAexNvBOCbfSohmsL36N27t4sIvPHGGyQmJtK3b19OnDjBgQMH3NrExsaSlJQEQM+ePTl69KjHvu+44w63Ohs3bmT06NEApKamEhYWVuv4Nm7cyO23305AQACBgYHccccdbNiwgfj4eFatWsUzzzzDhg0bCAkJISQkBKPRyAMPPMDXX3+NyWSq78fhYOXKlSQlJRETE8MPP/wAgEajYeTIkY46a9eupU+fPsTHx7NmzRr27NnjKBszZgwA119/PQUFBY6Lzk033YTBYCAiIoLIyEiys7MJDAxkx44dzJkzh5YtW3LnnXfy4Ycf1niMvLw8CgsLufbaawG46667HMdNT0/n448/JikpiT59+pCbm+vx/7Ah8BmPHiAmpD1+6DhScJBKixWdxqeuY4omojbP+1ISEBDg+HvdunWsXr2aTZs2YTKZGDhwoMe11VUhBrCJX1XopqZ6Go0Gs9ncoOPu1KkTO3fuZPny5Tz//PMMHjyYadOmsXXrVr7//nsWLVrEW2+9xZo1a1zaDR8+nOzsbFJSUnj//fcd9uDgYAIDAzly5AixsbEMHz6c4cOHc/PNNzvi5Uaj0RGXLysr46GHHmL79u20bduWGTNmuHxW1ZcrVr2v/tlVfS4ajYaBAwcycOBA4uPj+eijjxg9enStx/CElJI333yT4cOH1/cjrTc+pYQaPw1R/u2xak+x71SDP9OlUFwygoKCKCwsrLE8Pz+fsLAwTCYT+/fvZ/PmzQ0+hn79+vHFF18ANu/z3LnaU1T179+fJUuWUFJSQnFxMYsXL6Z///5kZWVhMpm45557ePrpp9m5cydFRUXk5+czYsQIXnvtNX788Ue3/lauXElGRoaLyFcxdepUJk2a5PC+pZQ1CmuVPSIigqKiIsfcRBVVcwYbN2503G3UxM8//+zidWdkZNC+ffsajxEaGkpQUJBjZc5nn33maDt8+HDeeecdx0qhX375heLi4hqPfTH4lEcPcE1Ye07m7SJ9TzYJ0aFNPRyF4oJo0aIF/fr1Iy4ujhtvvJGbbrrJpTw1NZV3332Xrl270rlzZ/r27dvgY5g+fTpjxoxhwYIFXHvttURFRREUFFRj/R49enD//ffTu3dvAMaPH09ycjIrV67k6aefxs/PD51OxzvvvENhYSG33norZWVlSCmZPbumR3Q8M2nSJEcc3mAwEBgYSL9+/UhOTnarGxoayoQJE4iLiyMqKopevXq5lBuNRpKTk6msrGTevNoXCBYVFfHII4+Ql5eHVqvlmmuuYc6cObUe44MPPmDChAn4+fkxYMAAx4Vk/PjxHD16lB49eiClpGXLlixZsqRen4O3iKqZ4cuJlJQUeaEbj7y09SU+2/c12hMvsu25werpRsUFsW/fPrp27drUw2hSysvL0Wg0aLVaNm3axKRJkxyTw77CwIEDefXVV0lJSWm0YxQVFREYGAjYJtlPnTrFP/7xj4vq09P3UwixQ0rp8UR8zqNv6d8SC6XkFRdwurCcVsHGph6SQnFFcvz4cUaNGoXVakWv1zN37tymHtIVybfffsvf/vY3zGYz7du3d0zeXkp8TugjTZEACG0hh3KKlNArFBdIx44d+d///tfUw2hU1q1b1+jHuPPOO7nzzjsb/Ti14VOTsQAtTbbMl366Ag7nNM7EhkKhUFxJ+JzQR/rbPHq9oZAjZ5TQKxQKhc8JfZVH3yKknMM5RU08GoVCoWh6fE7oA3WB+Gv9CQwo4bDy6BUKhcL3hF4IQUv/luj1hZw4W0K52dLUQ1Io6s3FpCkGeP311ykpKWnAEV0ZmM1mnn32WTp27EhSUhJJSUnMmjWrwfp3TgbnjNVq5dFHHyUuLo74+Hh69erFkSNHGuy4F4vPCT3YwjdWTT5WCSfONr8vu+LKxxeEvqFTKXjD888/T1ZWFrt37yYjI4MNGzZ4zFEvpcRqtTbYcT///HOysrLYtWsXu3fvZvHixY7MmpcDPin0kf6RlFpsj2tnF5Q38WgUivpTPU0xwCuvvOJIaTt9+nTAcwrgN954g6ysLG644QZuuOEGt75rSqd78OBBhgwZQmJiIj169ODQoUMAvPzyy47NPaqyLw4cOJCqhxrPnDlDTEwMAB9++CFpaWkMGjSIwYMHU1RUxODBgx0pkJcuXeoYx8cff0xCQgKJiYmMHTuWwsJCYmNjHcJcUFDg8r4uSkpKmDt3Lm+++SZGo21ZdVBQEDNmzADg6NGjdO7cmXvvvZe4uDhOnDjBpEmTSElJoXv37o7PFGypm//0pz8RHx9P7969OXjwoKNs/fr1/OY3v6FDhw4O7/7UqVO0bt0aPz+bpEZHRzuSwNV0jOXLl9OlSxd69uzJo48+ys033+z4P/39739P7969SU5OdvnMLhSfW0cPEGGKIL8yF4Dc4st/UwDFZc6KKfDr7obtMyoebnypxuLqaYrT09M5cOAAW7duRUpJWloa69evJycnxy0FcEhICLNnz2bt2rVERES49V1TOt27776bKVOmcPvtt1NWVobVamXFihUsXbqULVu2YDKZOHu27g3idu7cya5duwgPD8dsNrN48WKCg4M5c+YMffv2JS0tjb179/LXv/6VH374gYiICM6ePUtQUBADBw7k22+/5bbbbuOzzz7jjjvucNtIpCYOHjxIu3btak3TcODAAT766CNHyohZs2YRHh6OxWJh8ODB7Nq1i4QE28ZFISEh7N69m48//pjHHnuMZcuWATZR37hxI/v37yctLY3f/va3jBo1iuuuu44NGzYwePBg7rnnHkc6Bk/H6NSpEw8++CDr168nNjbWkUGzqv6gQYOYN28eeXl59O7dmyFDhrgktasv3uwZO08IcVoI8VMN5U87bTH4kxDCIoQIt5cdFULstpddstzBoYZQyi1lgJmzRcqjV1z5pKenk56eTnJyMj169GD//v0cOHDAYwrguvCUTrewsJDMzExuv/12wJb/xWQysXr1asaNG+dIIxweHl5n/0OHDnXUk1Ly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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def main():\n",
    "    for args in [\n",
    "        {'model_type': 'GraphSage', 'dataset': 'cora', 'num_layers': 2, 'heads': 1, 'batch_size': 32, 'hidden_dim': 32, 'dropout': 0.5, 'epochs': 500, 'opt': 'adam', 'opt_scheduler': 'none', 'opt_restart': 0, 'weight_decay': 5e-3, 'lr': 0.01},\n",
    "    ]:\n",
    "        args = objectview(args)\n",
    "        for model in ['GraphSage', 'GAT']:\n",
    "            args.model_type = model\n",
    "\n",
    "            # Match the dimension.\n",
    "            if model == 'GAT':\n",
    "              args.heads = 2\n",
    "            else:\n",
    "              args.heads = 1\n",
    "\n",
    "            if args.dataset == 'cora':\n",
    "                dataset = Planetoid(root='/tmp/cora', name='Cora')\n",
    "                #针对Planetoid无法下载数据问题，可参考我写的博文：Planetoid无法直接下载Cora等数据集的3个解决方式https://blog.csdn.net/PolarisRisingWar/article/details/116399648\n",
    "            else:\n",
    "                raise NotImplementedError(\"Unknown dataset\") \n",
    "            test_accs, losses = train(dataset, args) \n",
    "\n",
    "            print(\"Maximum accuracy: {0}\".format(max(test_accs)))\n",
    "            print(\"Minimum loss: {0}\".format(min(losses)))\n",
    "\n",
    "            plt.title(dataset.name)\n",
    "            plt.plot(losses, label=\"training loss\" + \" - \" + args.model_type)\n",
    "            plt.plot(test_accs, label=\"test accuracy\" + \" - \" + args.model_type)\n",
    "        plt.legend()\n",
    "        plt.show()\n",
    "\n",
    "if __name__ == '__main__':\n",
    "    main()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "gHELqjARZ1W5"
   },
   "source": [
    "## Question 1.1: What is the maximum accuracy you could get on test set for GraphSage? (10 points)\n",
    "\n",
    "Submit your answers on Gradescope."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "PlCtBEBLMBkR"
   },
   "source": [
    "## Question 1.2: What is the maximum accuracy you could get on test set for GAT? (10 points)\n",
    "\n",
    "Submit your answers on Gradescope."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Nwwq0nSdmsOL"
   },
   "source": [
    "# 2 DeepSNAP Basics\n",
    "\n",
    "In previous Colabs we used both of graph class (NetworkX) and tensor (PyG) representations of graphs separately. The graph class `nx.Graph` provides rich analysis and manipulation functionalities, such as the clustering coefficient and PageRank. To feed the graph into the model, we need to transform the graph into tensor representations including edge tensor `edge_index` and node attributes tensors `x` and `y`. But only using tensors (as the graphs formatted in PyG `datasets` and `data`) will make many graph manipulations and analysis less efficient and harder. So, in this Colab we will use DeepSNAP which combines both representations and offers a full pipeline for GNN training / validation / testing.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Sf7vUmdNKCjA"
   },
   "source": [
    "In general, [DeepSNAP](https://github.com/snap-stanford/deepsnap) is a Python library to assist efficient deep learning on graphs. DeepSNAP features in its support for flexible graph manipulation, standard pipeline, heterogeneous graphs and simple API.\n",
    "\n",
    "1. DeepSNAP is easy to be used for the sophisticated graph manipulations, such as feature computation, pretraining, subgraph extraction etc. during/before the training.\n",
    "2. In most frameworks, standard pipelines for node, edge, link, graph-level tasks under inductive or transductive settings are left to the user to code. In practice, there are additional design choices involved (such as how to split dataset for link prediction). DeepSNAP provides such a standard pipeline that greatly saves repetitive coding efforts, and enables fair comparision for models.\n",
    "3. Many real-world graphs are heterogeneous graphs. But packages support for heterogeneous graphs, including data storage and flexible message passing, is lacking. DeepSNAP provides an efficient and flexible heterogeneous graph that supports both the node and edge heterogeneity.\n",
    "\n",
    "[DeepSNAP](https://github.com/snap-stanford/deepsnap) is a newly released project and it is still under development. If you find any bugs or have any improvement ideas, feel free to raise issues or create pull requests on the GitHub directly :)\n",
    "\n",
    "In this Colab, we will focus on DeepSNAP graph manipulations and splitting settings."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "20SvvngpQmmQ"
   },
   "source": [
    "## Setup"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "id": "zfbBVFmAQlwz"
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import networkx as nx\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from deepsnap.graph import Graph\n",
    "from deepsnap.batch import Batch\n",
    "from deepsnap.dataset import GraphDataset\n",
    "from torch_geometric.datasets import Planetoid, TUDataset\n",
    "\n",
    "from torch.utils.data import DataLoader\n",
    "\n",
    "def visualize(G, color_map=None, seed=123):\n",
    "  if color_map is None:\n",
    "    color_map = '#c92506'\n",
    "  plt.figure(figsize=(8, 8))\n",
    "  nodes = nx.draw_networkx_nodes(G, pos=nx.spring_layout(G, seed=seed), \\\n",
    "                                 label=None, node_color=color_map, node_shape='o', node_size=150)\n",
    "  edges = nx.draw_networkx_edges(G, pos=nx.spring_layout(G, seed=seed), alpha=0.5)\n",
    "  if color_map is not None:\n",
    "    plt.scatter([],[], c='#c92506', label='Nodes with label 0', edgecolors=\"black\", s=140)\n",
    "    plt.scatter([],[], c='#fcec00', label='Nodes with label 1', edgecolors=\"black\", s=140)\n",
    "    plt.legend(prop={'size': 13}, handletextpad=0)\n",
    "  nodes.set_edgecolor('black')\n",
    "  plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ic-o1P3r6hr2"
   },
   "source": [
    "## DeepSNAP Graph\n",
    "\n",
    "The `deepsnap.graph.Graph` class is the core class of DeepSNAP. It not only represents a graph in tensor format but also references to a graph object from graph manipulation package.\n",
    "\n",
    "Currently DeepSNAP supports [NetworkX](https://networkx.org/) and [Snap.py](https://snap.stanford.edu/snappy/doc/index.html) as the back end graph manipulation package.\n",
    "\n",
    "In this Colab, we will use the NetworkX as the back end graph manipulation package."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Ispq_lIoJl_z"
   },
   "source": [
    "Lets first try to convert a simple random NetworkX graph to a DeepSNAP graph."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "id": "zT5qca3x6XpG"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(0, {'node_feature': tensor([0.9455, 0.5904, 0.9768, 0.4834, 0.3970]), 'node_label': tensor(1)})\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Graph(G=[], edge_index=[2, 524], edge_label_index=[2, 524], node_feature=[100, 5], node_label=[100], node_label_index=[100])\n",
      "Node feature (node_feature) has shape torch.Size([100, 5]) and type torch.float32\n",
      "Node label (node_label) has shape torch.Size([100]) and type torch.int64\n",
      "Edge index (edge_index) has shape torch.Size([2, 524]) and type torch.int64\n",
      "The DeepSNAP graph has <class 'networkx.classes.graph.Graph'> as the internal manupulation graph\n"
     ]
    }
   ],
   "source": [
    "num_nodes = 100\n",
    "p = 0.05\n",
    "seed = 100\n",
    "\n",
    "# Generate a networkx random graph\n",
    "G = nx.gnp_random_graph(num_nodes, p, seed=seed)\n",
    "\n",
    "# Generate some random node features and labels\n",
    "node_feature = {node : torch.rand([5, ]) for node in G.nodes()}\n",
    "node_label = {node : torch.randint(0, 2, ()) for node in G.nodes()}\n",
    "\n",
    "# Set the random features and labels to G\n",
    "nx.set_node_attributes(G, node_feature, name='node_feature')\n",
    "nx.set_node_attributes(G, node_label, name='node_label')\n",
    "\n",
    "# Print one node example\n",
    "for node in G.nodes(data=True):\n",
    "  print(node)\n",
    "  break\n",
    "\n",
    "color_map = ['#c92506' if node[1]['node_label'].item() == 0 else '#fcec00' for node in G.nodes(data=True)]\n",
    "\n",
    "# Visualize the graph\n",
    "visualize(G, color_map=color_map)\n",
    "\n",
    "# Transform the networkx graph into the deepsnap graph\n",
    "graph = Graph(G)\n",
    "\n",
    "# Print out the general deepsnap graph information\n",
    "print(graph)\n",
    "\n",
    "# DeepSNAP will convert node attributes to tensors\n",
    "# Notice the type of tensors\n",
    "print(\"Node feature (node_feature) has shape {} and type {}\".format(graph.node_feature.shape, graph.node_feature.dtype))\n",
    "print(\"Node label (node_label) has shape {} and type {}\".format(graph.node_label.shape, graph.node_label.dtype))\n",
    "\n",
    "# DeepSNAP will also generate the edge_index tensor\n",
    "print(\"Edge index (edge_index) has shape {} and type {}\".format(graph.edge_index.shape, graph.edge_index.dtype))\n",
    "\n",
    "# Different from only storing tensors, deepsnap graph also references to the networkx graph\n",
    "# We will discuss why the reference will be helpful later\n",
    "print(\"The DeepSNAP graph has {} as the internal manupulation graph\".format(type(graph.G)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "PNMbc307KOQD"
   },
   "source": [
    "In DeepSNAP we have three levels of attributes. In this example, we have the **node level** attributes including `node_feature` and `node_label`. The other two levels of attributes are graph and edge attributes. The usage is similar to the node level one except that the feature becomes `edge_feature` or `graph_feature` and label becomes `edge_label` or `graph_label` etc."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "G8Xz58_Da0qL"
   },
   "source": [
    "Similar to the NetworkX graph, we can easily get some basic information of the graph through class properties directly."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "id": "dLo4zWAoeg6S"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The random graph has 100 nodes\n",
      "The random graph has 262 edges\n"
     ]
    }
   ],
   "source": [
    "# Number of nodes\n",
    "print(\"The random graph has {} nodes\".format(graph.num_nodes))\n",
    "\n",
    "# Number of edges\n",
    "print(\"The random graph has {} edges\".format(graph.num_edges))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Po7IaRmwblI5"
   },
   "source": [
    "DeepSNAP also provides functions that can automatically transform the PyG datasets into a list of DeepSNAP graphs.\n",
    "\n",
    "Here we transform the CORA dataset into a list of DeepSNAP graphs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Graph(G=[], edge_index=[2, 10556], edge_label_index=[2, 10556], node_feature=[2708, 1433], node_label=[2708], node_label_index=[2708])\n"
     ]
    }
   ],
   "source": [
    "root = './tmp/cora'\n",
    "name = 'Cora'\n",
    "\n",
    "# The Cora dataset\n",
    "pyg_dataset= Planetoid(root, name)\n",
    "\n",
    "# PyG dataset to a list of deepsnap graphs\n",
    "graphs = GraphDataset.pyg_to_graphs(pyg_dataset)\n",
    "\n",
    "# Get the first deepsnap graph (CORA only has one graph)\n",
    "graph = graphs[0]\n",
    "print(graph)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "NLm5vVYMAP2x"
   },
   "source": [
    "## Question 2.1: What is the number of classes and number of features in the CORA graph? (5 points)\n",
    "\n",
    "Submit your answers on Gradescope."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "id": "8iF_Kyqr_JbY"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cora has 7 classes\n",
      "Cora has 1433 features\n"
     ]
    }
   ],
   "source": [
    "def get_num_node_classes(graph):\n",
    "  # TODO: Implement this function that takes a deepsnap graph object\n",
    "  # and return the number of node classes of that graph.\n",
    "\n",
    "  num_node_classes = 0\n",
    "\n",
    "  ############# Your code here #############\n",
    "  ## (~1 line of code)\n",
    "  ## Note\n",
    "  ## 1. Colab autocomplete functionality might be useful\n",
    "  ## 2. DeepSNAP documentation might be useful https://snap.stanford.edu/deepsnap/modules/graph.html\n",
    "  num_node_classes=graph.num_node_labels  #https://snap.stanford.edu/deepsnap/modules/graph.html#deepsnap.graph.Graph.num_node_labels\n",
    "\n",
    "  ##########################################\n",
    "\n",
    "  return num_node_classes\n",
    "\n",
    "def get_num_node_features(graph):\n",
    "  # TODO: Implement this function that takes a deepsnap graph object\n",
    "  # and return the number of node features of that graph.\n",
    "\n",
    "  num_node_features = 0\n",
    "\n",
    "  ############# Your code here #############\n",
    "  ## (~1 line of code)\n",
    "  ## Note\n",
    "  ## 1. Colab autocomplete functionality might be useful\n",
    "  ## 2. DeepSNAP documentation might be useful https://snap.stanford.edu/deepsnap/modules/graph.html\n",
    "  num_node_features=graph.num_node_features  #https://snap.stanford.edu/deepsnap/modules/graph.html#deepsnap.graph.Graph.num_node_features\n",
    "\n",
    "  ##########################################\n",
    "\n",
    "  return num_node_features\n",
    "\n",
    "num_node_classes = get_num_node_classes(graph)\n",
    "num_node_features = get_num_node_features(graph)\n",
    "print(\"{} has {} classes\".format(name, num_node_classes))\n",
    "print(\"{} has {} features\".format(name, num_node_features))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "rwKbzhHUAckZ"
   },
   "source": [
    "## DeepSNAP Dataset\n",
    "\n",
    "Now, lets talk about DeepSNAP dataset. A `deepsnap.dataset.GraphDataset` contains a list of `deepsnap.graph.Graph` objects. In addition to list of graphs, you can also specify what task the dataset will be used on, such as node level task (`task=node`), edge level task (`task=link_pred`) and graph level task (`task=graph`).\n",
    "\n",
    "It also contains many other useful parameters during initialization and other functinoalities. If you are interested, you can take a look at the [documentation](https://snap.stanford.edu/deepsnap/modules/dataset.html#deepsnap-graphdataset)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HSidf9E0hn2s"
   },
   "source": [
    "Lets now use COX2 dataset which contains a list of graphs and specify the task to `graph` when we initialize the DeepSNAP dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "id": "l4kqUldyoaS_"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GraphDataset(467)\n"
     ]
    }
   ],
   "source": [
    "root = './tmp/cox2'\n",
    "name = 'COX2'\n",
    "\n",
    "# Load the dataset through PyG\n",
    "pyg_dataset = TUDataset(root, name)\n",
    "\n",
    "# Convert to a list of deepsnap graphs\n",
    "graphs = GraphDataset.pyg_to_graphs(pyg_dataset)\n",
    "\n",
    "# Convert list of deepsnap graphs to deepsnap dataset with specified task=graph\n",
    "dataset = GraphDataset(graphs, task='graph')\n",
    "print(dataset)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "7sCV3xJWCddX"
   },
   "source": [
    "## Question 2.2: What is the label of the graph (index 100 in the COX2 dataset)? (5 points)\n",
    "\n",
    "Submit your answers on Gradescope."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "id": "LIis9oTZAfs3"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Graph(G=[], edge_index=[2, 82], edge_label_index=[2, 82], graph_label=[1], node_feature=[39, 35], node_label_index=[39], task=[])\n",
      "Graph with index 100 has label 0\n"
     ]
    }
   ],
   "source": [
    "def get_graph_class(dataset, idx):\n",
    "  # TODO: Implement this function that takes a deepsnap dataset object,\n",
    "  # the index of the graph in the dataset, and returns the class/label \n",
    "  # of the graph (in integer).\n",
    "\n",
    "  label = -1\n",
    "\n",
    "  ############# Your code here ############\n",
    "  ## (~1 line of code)\n",
    "  ## Note\n",
    "  ## 1. The label refers to the graph-level attribute\n",
    "  label=dataset[idx].graph_label.item()\n",
    "\n",
    "  #########################################\n",
    "\n",
    "  return label\n",
    "\n",
    "graph_0 = dataset[0]\n",
    "print(graph_0)\n",
    "idx = 100\n",
    "label = get_graph_class(dataset, idx)\n",
    "print('Graph with index {} has label {}'.format(idx, label))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "fKhcVeAhCwoY"
   },
   "source": [
    "## Question 2.3: What is the number of edges for the graph (index 200 in the COX2 dataset)? (5 points)\n",
    "\n",
    "Submit your answers on Gradescope."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "id": "f5m2DOfhBtWv"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Graph with index 200 has 49 edges\n"
     ]
    }
   ],
   "source": [
    "def get_graph_num_edges(dataset, idx):\n",
    "  # TODO: Implement this function that takes a deepsnap dataset object,\n",
    "  # the index of the graph in dataset, and returns the number of \n",
    "  # edges in the graph (in integer).\n",
    "\n",
    "  num_edges = 0\n",
    "\n",
    "  ############# Your code here ############\n",
    "  ## (~1 lines of code)\n",
    "  ## Note\n",
    "  ## 1. You can use the class property directly\n",
    "  num_edges=dataset[idx].num_edges  #https://snap.stanford.edu/deepsnap/modules/graph.html#deepsnap.graph.Graph.num_edges\n",
    "\n",
    "  #########################################\n",
    "\n",
    "  return num_edges\n",
    "\n",
    "idx = 200\n",
    "num_edges = get_graph_num_edges(dataset, idx)\n",
    "print('Graph with index {} has {} edges'.format(idx, num_edges))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "AXa7yIG4E0Fp"
   },
   "source": [
    "# 3 DeepSNAP Advanced\n",
    "\n",
    "We have learned the basic use of DeepSNAP graph and dataset :)\n",
    "\n",
    "Lets move on to some more advanced functionalities.\n",
    "\n",
    "In this section we will use DeepSNAP for feature computation and transductive/inductive splittings."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Y5fsGBLY8cxa"
   },
   "source": [
    "## Setup"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "id": "g-jgRLiQ8cSj"
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import networkx as nx\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from deepsnap.graph import Graph\n",
    "from deepsnap.batch import Batch\n",
    "from deepsnap.dataset import GraphDataset\n",
    "from torch_geometric.datasets import Planetoid, TUDataset\n",
    "\n",
    "from torch.utils.data import DataLoader"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "HnazPGGAJAZN"
   },
   "source": [
    "## Data Split in Graphs\n",
    "\n",
    "Data splitting in graphs can be much harder than that in CV or NLP.\n",
    "\n",
    "In general, the data splitting in graphs can be divided into two settings, **inductive** and **transductive**."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "l9KG_MhqsWBp"
   },
   "source": [
    "## Inductive Split\n",
    "\n",
    "As what we have learned in the lecture, inductive setting will split multiple graphs into each training/valiation and test sets.\n",
    "\n",
    "Here is an example of DeepSNAP inductive splitting for a list of graphs in the graph level task (graph classification etc.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "id": "Gpc6bTm3GF02"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "COX2 train dataset: GraphDataset(373)\n",
      "COX2 validation dataset: GraphDataset(46)\n",
      "COX2 test dataset: GraphDataset(48)\n"
     ]
    }
   ],
   "source": [
    "root = './tmp/cox2'\n",
    "name = 'COX2'\n",
    "\n",
    "pyg_dataset = TUDataset(root, name)\n",
    "\n",
    "graphs = GraphDataset.pyg_to_graphs(pyg_dataset)\n",
    "\n",
    "# Here we specify the task as graph-level task such as graph classification\n",
    "task = 'graph'\n",
    "dataset = GraphDataset(graphs, task=task)\n",
    "\n",
    "# Specify transductive=False (inductive)\n",
    "dataset_train, dataset_val, dataset_test = dataset.split(transductive=False, split_ratio=[0.8, 0.1, 0.1])\n",
    "\n",
    "print(\"COX2 train dataset: {}\".format(dataset_train))\n",
    "print(\"COX2 validation dataset: {}\".format(dataset_val))\n",
    "print(\"COX2 test dataset: {}\".format(dataset_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "yWKQwa4WsgQp"
   },
   "source": [
    "## Transductive Split\n",
    "\n",
    "In transductive setting, the training /validation / test sets are on the same graph.\n",
    "\n",
    "Here we transductively split the CORA graph in the node level task. \n",
    "\n",
    "(Notice that in DeepSNAP default setting the split is random, but you can also make a fixed split by specifying `fixed_split=True` when loading the dataset from PyG or changing the `node_label_index` directly)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "id": "b5OdxSg4sfyR"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cora train dataset: GraphDataset(1)\n",
      "Cora validation dataset: GraphDataset(1)\n",
      "Cora test dataset: GraphDataset(1)\n",
      "Original Cora has 2708 nodes\n",
      "After the split, Cora has 2166 training nodes\n",
      "After the split, Cora has 270 validation nodes\n",
      "After the split, Cora has 272 test nodes\n"
     ]
    }
   ],
   "source": [
    "root = './tmp/cora'\n",
    "name = 'Cora'\n",
    "\n",
    "pyg_dataset = Planetoid(root, name)\n",
    "\n",
    "graphs = GraphDataset.pyg_to_graphs(pyg_dataset)\n",
    "\n",
    "# Here we specify the task as node-level task such as node classification\n",
    "task = 'node'\n",
    "\n",
    "dataset = GraphDataset(graphs, task=task)\n",
    "\n",
    "# Specify we want the transductive splitting\n",
    "dataset_train, dataset_val, dataset_test = dataset.split(transductive=True, split_ratio=[0.8, 0.1, 0.1])\n",
    "\n",
    "print(\"Cora train dataset: {}\".format(dataset_train))\n",
    "print(\"Cora validation dataset: {}\".format(dataset_val))\n",
    "print(\"Cora test dataset: {}\".format(dataset_test))\n",
    "\n",
    "print(\"Original Cora has {} nodes\".format(dataset.num_nodes[0]))\n",
    "\n",
    "# The nodes in each set can be find in node_label_index\n",
    "print(\"After the split, Cora has {} training nodes\".format(dataset_train[0].node_label_index.shape[0]))\n",
    "print(\"After the split, Cora has {} validation nodes\".format(dataset_val[0].node_label_index.shape[0]))\n",
    "print(\"After the split, Cora has {} test nodes\".format(dataset_test[0].node_label_index.shape[0]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "d7ePKgM00lGE"
   },
   "source": [
    "## Edge Level Split\n",
    "\n",
    "Compared to the node and graph level splitting, edge level splitting is a little bit tricky ;)\n",
    "\n",
    "Usually in edge level splitting, we need to sample negative edges, split positive edges into different datasets, split training edges into message passing edges and supervision edges, and resample the negative edges during the training etc."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "SnzISX5RoiR6"
   },
   "source": [
    "### All Mode\n",
    "\n",
    "Now lets start with a simpler edge level splitting mode, the `edge_train_mode=\"all\"` mode in DeepSNAP."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "id": "_D104xO6137n"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cora train dataset: GraphDataset(1)\n",
      "Cora validation dataset: GraphDataset(1)\n",
      "Cora test dataset: GraphDataset(1)\n"
     ]
    }
   ],
   "source": [
    "root = './tmp/cora'\n",
    "name = 'Cora'\n",
    "\n",
    "pyg_dataset = Planetoid(root, name)\n",
    "\n",
    "graphs = GraphDataset.pyg_to_graphs(pyg_dataset)\n",
    "\n",
    "# Specify task as link_pred for edge-level task\n",
    "task = 'link_pred'\n",
    "\n",
    "# Specify the train mode, \"all\" mode is default for deepsnap dataset\n",
    "edge_train_mode = \"all\"\n",
    "\n",
    "dataset = GraphDataset(graphs, task=task, edge_train_mode=edge_train_mode)\n",
    "\n",
    "# Transductive link prediction split\n",
    "dataset_train, dataset_val, dataset_test = dataset.split(transductive=True, split_ratio=[0.8, 0.1, 0.1])\n",
    "\n",
    "print(\"Cora train dataset: {}\".format(dataset_train))\n",
    "print(\"Cora validation dataset: {}\".format(dataset_val))\n",
    "print(\"Cora test dataset: {}\".format(dataset_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "GscopwOXC_Y7"
   },
   "source": [
    "In DeepSNAP, the indices of supervision edges are stored in `edge_label_index` tensor and the corresponding edge labels are stored in `edge_label` tensor."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "id": "XJF8fZnA2eLR"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original Cora graph has 5278 edges\n",
      "Because Cora graph is undirected, the original edge_index has shape torch.Size([2, 10556])\n",
      "The training set has message passing edge index shape torch.Size([2, 8444])\n",
      "The training set has supervision edge index shape torch.Size([2, 16888])\n",
      "The validation set has message passing edge index shape torch.Size([2, 8444])\n",
      "The validation set has supervision edge index shape torch.Size([2, 2108])\n",
      "The test set has message passing edge index shape torch.Size([2, 9498])\n",
      "The test set has supervision edge index shape torch.Size([2, 2116])\n"
     ]
    }
   ],
   "source": [
    "print(\"Original Cora graph has {} edges\".format(dataset[0].num_edges))\n",
    "print(\"Because Cora graph is undirected, the original edge_index has shape {}\".format(dataset[0].edge_index.shape))\n",
    "\n",
    "print(\"The training set has message passing edge index shape {}\".format(dataset_train[0].edge_index.shape))\n",
    "print(\"The training set has supervision edge index shape {}\".format(dataset_train[0].edge_label_index.shape))\n",
    "\n",
    "print(\"The validation set has message passing edge index shape {}\".format(dataset_val[0].edge_index.shape))\n",
    "print(\"The validation set has supervision edge index shape {}\".format(dataset_val[0].edge_label_index.shape))\n",
    "\n",
    "print(\"The test set has message passing edge index shape {}\".format(dataset_test[0].edge_index.shape))\n",
    "print(\"The test set has supervision edge index shape {}\".format(dataset_test[0].edge_label_index.shape))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "s6BX-I_oEKQX"
   },
   "source": [
    "We can see that both training and validation sets have the same message passing edges (`edge_index`) in the `all` mode. Also, in training set, the postive supervision edges (`edge_label_index`) are same with the message passing edges. However, in the test set the message passing edges are the combination of message passing edges from training and validation sets.\n",
    "\n",
    "Notice that the `edge_label` and `edge_label_index` have included the negative edges (default number of negative edges is same with the number of positive edges).\n",
    "\n",
    "Now, lets implement a function that checks whether two edge index tensors are disjoint and explore more edge splitting properties by using that function."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "YOZHDskbAKN6"
   },
   "source": [
    "## Question 3.1 - 3.5: Implement the function that checks whether two edge_index tensors are disjoint. Then answer the True/False questions below. (5 points)\n",
    "\n",
    "Submit your answers on Gradescope."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n",
      "True\n",
      "False\n",
      "True\n"
     ]
    }
   ],
   "source": [
    "#PRW\n",
    "s=set()\n",
    "eg1=tuple(torch.tensor([1,2]).numpy())\n",
    "eg2=tuple(torch.tensor([1,2]).numpy())\n",
    "eg3=tuple(torch.tensor([2,1]).numpy())\n",
    "eg4=tuple(torch.tensor([2,1]).numpy()[::-1])\n",
    "s.add(eg1)\n",
    "print(eg1 in s)\n",
    "print(eg2 in s)\n",
    "print(eg3 in s)\n",
    "print(eg4 in s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1, 2)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#PRW\n",
    "eg1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2])"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#PRW\n",
    "eg4=torch.tensor([2,1]).numpy()[::-1]\n",
    "eg4"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "id": "wgRYdyPp8EmO"
   },
   "outputs": [],
   "source": [
    "def edge_indices_disjoint(edge_index_1, edge_index_2):\n",
    "  # TODO: Implement this function that takes two edge index tensors,\n",
    "  # and returns whether these two edge index tensors are disjoint.\n",
    "  disjoint = None\n",
    "\n",
    "  ############# Your code here ############\n",
    "  ## (~5 lines of code)\n",
    "  ## Note\n",
    "  ## 1. Here disjoint means that there is no single edge belongs to either edge index tensors\n",
    "  ## 2. You do not need to consider the undirected case. For example, if edge_index_1 contains\n",
    "  ## edge (a, b) and edge_index_2 contains edge (b, a). We will treat them as disjoint in this\n",
    "  ## function.\n",
    "\n",
    "  #遍历应该会贼慢，所以用集合\n",
    "  edge_set=set()\n",
    "  for i in range(edge_index_1.shape[1]):\n",
    "    e=tuple(edge_index_1[:,i].numpy())\n",
    "    edge_set.add(e)\n",
    "  for j in range(edge_index_2.shape[1]):\n",
    "    e1=tuple(edge_index_2[:,j].numpy())\n",
    "    if e1 in edge_set:\n",
    "      return False\n",
    "    e2=tuple(edge_index_2[:,j].numpy()[::-1])\n",
    "    if e2 in edge_set:\n",
    "      return False\n",
    "  disjoint=True\n",
    "\n",
    "  #########################################\n",
    "\n",
    "  return disjoint"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "id": "EL4ASIDDEIUf"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.1 Training (supervision) positve and negative edges are disjoint = True\n",
      "3.2 Validation (supervision) positve and negative edges are disjoint = True\n",
      "3.3 Test (supervision) positve and negative edges are disjoint = True\n",
      "3.4 Test (supervision) positve and validation (supervision) positve edges are disjoint = True\n",
      "3.5 Validation (supervision) positve and training (supervision) positve edges are disjoint = True\n"
     ]
    }
   ],
   "source": [
    "num_train_edges = dataset_train[0].edge_label_index.shape[1] // 2\n",
    "train_pos_edge_index = dataset_train[0].edge_label_index[:, :num_train_edges]\n",
    "train_neg_edge_index = dataset_train[0].edge_label_index[:, num_train_edges:]\n",
    "print(\"3.1 Training (supervision) positve and negative edges are disjoint = {}\"\\\n",
    "        .format(edge_indices_disjoint(train_pos_edge_index, train_neg_edge_index)))\n",
    "\n",
    "num_val_edges = dataset_val[0].edge_label_index.shape[1] // 2\n",
    "val_pos_edge_index = dataset_val[0].edge_label_index[:, :num_val_edges]\n",
    "val_neg_edge_index = dataset_val[0].edge_label_index[:, num_val_edges:]\n",
    "print(\"3.2 Validation (supervision) positve and negative edges are disjoint = {}\"\\\n",
    "        .format(edge_indices_disjoint(val_pos_edge_index, val_neg_edge_index)))\n",
    "\n",
    "num_test_edges = dataset_test[0].edge_label_index.shape[1] // 2\n",
    "test_pos_edge_index = dataset_test[0].edge_label_index[:, :num_test_edges]\n",
    "test_neg_edge_index = dataset_test[0].edge_label_index[:, num_test_edges:]\n",
    "print(\"3.3 Test (supervision) positve and negative edges are disjoint = {}\"\\\n",
    "        .format(edge_indices_disjoint(test_pos_edge_index, test_neg_edge_index)))\n",
    "\n",
    "print(\"3.4 Test (supervision) positve and validation (supervision) positve edges are disjoint = {}\"\\\n",
    "        .format(edge_indices_disjoint(test_pos_edge_index, val_pos_edge_index)))\n",
    "print(\"3.5 Validation (supervision) positve and training (supervision) positve edges are disjoint = {}\"\\\n",
    "        .format(edge_indices_disjoint(val_pos_edge_index, train_pos_edge_index)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1174"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#PRW\n",
    "dataset_train[0].edge_label_index[:,1][0].item()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "8jLoVN5ZBTuA"
   },
   "source": [
    "### Disjoint Mode\n",
    "\n",
    "Now lets look at a relatively more complex transductive edge split setting, which is the `edge_train_mode=\"disjoint\"` mode in DeepSNAP (also the transductive link prediction splitting talked in the lecture)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "id": "3Rqzfb-0BTBm"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The edge index of original graph has shape: torch.Size([2, 10556])\n",
      "The edge index of training message edges has shape: torch.Size([2, 6754])\n",
      "The edge index of training supervision edges has shape: torch.Size([2, 3380])\n",
      "The edge index of validation message edges has shape: torch.Size([2, 8444])\n",
      "The edge index of validation supervision edges has shape: torch.Size([2, 2108])\n",
      "The edge index of test message edges has shape: torch.Size([2, 9498])\n",
      "The edge index of test supervision edges has shape: torch.Size([2, 2116])\n"
     ]
    }
   ],
   "source": [
    "edge_train_mode = \"disjoint\"\n",
    "\n",
    "dataset = GraphDataset(graphs, task='link_pred', edge_train_mode=edge_train_mode)\n",
    "orig_edge_index = dataset[0].edge_index\n",
    "dataset_train, dataset_val, dataset_test = dataset.split(\n",
    "    transductive=True, split_ratio=[0.8, 0.1, 0.1])\n",
    "\n",
    "train_message_edge_index = dataset_train[0].edge_index\n",
    "train_sup_edge_index = dataset_train[0].edge_label_index\n",
    "val_sup_edge_index = dataset_val[0].edge_label_index\n",
    "test_sup_edge_index = dataset_test[0].edge_label_index\n",
    "\n",
    "print(\"The edge index of original graph has shape: {}\".format(orig_edge_index.shape))\n",
    "print(\"The edge index of training message edges has shape: {}\".format(train_message_edge_index.shape))\n",
    "print(\"The edge index of training supervision edges has shape: {}\".format(train_sup_edge_index.shape))\n",
    "print(\"The edge index of validation message edges has shape: {}\".format(dataset_val[0].edge_index.shape))\n",
    "print(\"The edge index of validation supervision edges has shape: {}\".format(val_sup_edge_index.shape))\n",
    "print(\"The edge index of test message edges has shape: {}\".format(dataset_test[0].edge_index.shape))\n",
    "print(\"The edge index of test supervision edges has shape: {}\".format(test_sup_edge_index.shape))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "TUkBhiJNciol"
   },
   "source": [
    "You can see that the training / validation message passing edges and training supervision edges are splitted differently in those two modes!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "2WKfRjqAJHtK"
   },
   "source": [
    "### Resample Negative Edges\n",
    "\n",
    "During each training iteration, we usually need to resample the negative edges.\n",
    "\n",
    "Below we print the training and validation sets negative edges in two training iterations.\n",
    "\n",
    "You should find that the negative edges in training set will be resampled."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "id": "AMEbnx63JHWj"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "First iteration training negative edges:\n",
      "tensor([[1879,  882, 2574,  ..., 1766, 2088, 1036],\n",
      "        [ 832, 1563, 2227,  ..., 2253, 1096, 1347]])\n",
      "Second iteration training negative edges:\n",
      "tensor([[ 632, 2139, 1933,  ...,  147,  849, 2302],\n",
      "        [ 214,   63, 1586,  ...,  793, 2532, 2294]])\n",
      "First iteration validation negative edges:\n",
      "tensor([[1532, 2007, 2697,  ...,  631, 1702, 1183],\n",
      "        [1134, 2253,  407,  ...,  732,   15, 1412]])\n",
      "Second iteration validation negative edges:\n",
      "tensor([[1532, 2007, 2697,  ...,  631, 1702, 1183],\n",
      "        [1134, 2253,  407,  ...,  732,   15, 1412]])\n"
     ]
    }
   ],
   "source": [
    "dataset = GraphDataset(graphs, task='link_pred', edge_train_mode=\"disjoint\")\n",
    "datasets = {}\n",
    "follow_batch = []\n",
    "datasets['train'], datasets['val'], datasets['test'] = dataset.split(\n",
    "    transductive=True, split_ratio=[0.8, 0.1, 0.1])\n",
    "dataloaders = {\n",
    "  split: DataLoader(\n",
    "    ds, collate_fn=Batch.collate(follow_batch),\n",
    "    batch_size=1, shuffle=(split=='train')\n",
    "  )\n",
    "  for split, ds in datasets.items()\n",
    "}\n",
    "neg_edges_1 = None\n",
    "for batch in dataloaders['train']:\n",
    "  num_edges = batch.edge_label_index.shape[1] // 2\n",
    "  neg_edges_1 = batch.edge_label_index[:, num_edges:]\n",
    "  print(\"First iteration training negative edges:\")\n",
    "  print(neg_edges_1)\n",
    "  break\n",
    "neg_edges_2 = None\n",
    "for batch in dataloaders['train']:\n",
    "  num_edges = batch.edge_label_index.shape[1] // 2\n",
    "  neg_edges_2 = batch.edge_label_index[:, num_edges:]\n",
    "  print(\"Second iteration training negative edges:\")\n",
    "  print(neg_edges_2)\n",
    "  break\n",
    "\n",
    "neg_edges_1 = None\n",
    "for batch in dataloaders['val']:\n",
    "  num_edges = batch.edge_label_index.shape[1] // 2\n",
    "  neg_edges_1 = batch.edge_label_index[:, num_edges:]\n",
    "  print(\"First iteration validation negative edges:\")\n",
    "  print(neg_edges_1)\n",
    "  break\n",
    "neg_edges_2 = None\n",
    "for batch in dataloaders['val']:\n",
    "  num_edges = batch.edge_label_index.shape[1] // 2\n",
    "  neg_edges_2 = batch.edge_label_index[:, num_edges:]\n",
    "  print(\"Second iteration validation negative edges:\")\n",
    "  print(neg_edges_2)\n",
    "  break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "DEzqh7wEdrh0"
   },
   "source": [
    "If you are interested in more graph splitting settings, please refer to the DeepSNAP dataset [documentation](https://snap.stanford.edu/deepsnap/modules/dataset.html)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "XkrYyeSUI_9_"
   },
   "source": [
    "## Graph Transformation and Feature Computation\n",
    "\n",
    "The other DeepSNAP core functionality is graph transformation / feature computation.\n",
    "\n",
    "In DeepSNAP, we divide graph transformation / feature computation into two different types. One is the transformation before training (transform the whole dataset before training directly) and another one is the transformation during training (transform batches of graphs).\n",
    "\n",
    "Here is an example that uses NetworkX back end to calculate the PageRank value and update the value to tensors before the training (transform the dataset)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "id": "gnAVbZINLZ4I"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of features before transformation: 35\n",
      "Number of features after transformation: 36\n"
     ]
    }
   ],
   "source": [
    "def pagerank_transform_fn(graph):\n",
    "\n",
    "  # Get the referenced networkx graph\n",
    "  G = graph.G\n",
    "\n",
    "  # Calculate the pagerank by using networkx\n",
    "  pr = nx.pagerank(G)\n",
    "\n",
    "  # Transform the pagerank values to tensor\n",
    "  pr_feature = torch.tensor([pr[node] for node in range(graph.num_nodes)], dtype=torch.float32)\n",
    "  pr_feature = pr_feature.view(graph.num_nodes, 1)\n",
    "\n",
    "  # Concat the pagerank values to the node feature\n",
    "  graph.node_feature = torch.cat([graph.node_feature, pr_feature], dim=-1)\n",
    "\n",
    "root = './tmp/cox2'\n",
    "name = 'COX2'\n",
    "pyg_dataset = TUDataset(root, name)\n",
    "graphs = GraphDataset.pyg_to_graphs(pyg_dataset)\n",
    "dataset = GraphDataset(graphs, task='graph')\n",
    "print(\"Number of features before transformation: {}\".format(dataset.num_node_features))\n",
    "dataset.apply_transform(pagerank_transform_fn, update_tensor=False)\n",
    "print(\"Number of features after transformation: {}\".format(dataset.num_node_features))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "LHByE87SQkUw"
   },
   "source": [
    "## Question 3.6: Implement the transformation below and report the clustering coefficient of the node (index 3) of the graph (index 406) in the COX2 dataset. Rounded the answer to two decimal places. (5 points)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'networkx.classes.graph.Graph'>\n",
      "{0: 0.03320187324334541, 1: 0.03140409249831948, 2: 0.03153195626178245, 3: 0.033999294562979045, 4: 0.03445399167017414, 5: 0.032311799784932586, 6: 0.0325260484487752, 7: 0.03446771688692439, 8: 0.03492764351353999, 9: 0.03400572002885134, 10: 0.03492764351353999, 11: 0.03446771688692439, 12: 0.03491212916795992, 13: 0.035900570307606516, 14: 0.03617171252798891, 15: 0.035900570307606516, 16: 0.03491212916795992, 17: 0.014094182936016601, 18: 0.05033953008328389, 19: 0.048784416428741144, 20: 0.01421311870261539, 21: 0.01421311870261539, 22: 0.05243329098846763, 23: 0.01347941857377365, 24: 0.013607817899048346, 25: 0.013611921935259813, 26: 0.013742454509271822, 27: 0.013742454509271822, 28: 0.013611921935259813, 29: 0.013737355150878086, 30: 0.0140185909846367, 31: 0.0140185909846367, 32: 0.013737355150878086, 33: 0.014542717197278045, 34: 0.014542717197278045, 35: 0.014542717197278045, 36: 0.014987900051433497, 37: 0.014987900051433497, 38: 0.014987900051433497}\n",
      "{0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0, 12: 0, 13: 0, 14: 0, 15: 0, 16: 0, 17: 0, 18: 0, 19: 0, 20: 0, 21: 0, 22: 0, 23: 0, 24: 0, 25: 0, 26: 0, 27: 0, 28: 0, 29: 0, 30: 0, 31: 0, 32: 0, 33: 0, 34: 0, 35: 0, 36: 0, 37: 0, 38: 0}\n",
      "39\n"
     ]
    }
   ],
   "source": [
    "#PRW\n",
    "print(type(graphs[0].G))\n",
    "print(nx.pagerank(graphs[0].G))\n",
    "print(nx.clustering(graphs[0].G))\n",
    "print(graphs[0].num_nodes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "id": "RNEjfOZRNjYb"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The node has clustering coefficient: 0.17\n"
     ]
    }
   ],
   "source": [
    "def cluster_transform_fn(graph):\n",
    "  # TODO: Implement this function that takes an deepsnap graph object,\n",
    "  # transform the graph by adding nodes clustering coefficient into the \n",
    "  # graph.node_feature\n",
    "\n",
    "  ############# Your code here ############\n",
    "  ## (~5 lines of code)\n",
    "  ## Note\n",
    "  ## 1. Compute the clustering coefficient value for each node and\n",
    "  ## concat them to the last dimension of graph.node_feature\n",
    "  G=graph.G\n",
    "  cc=nx.clustering(G)\n",
    "  cc_feature = torch.tensor([cc[node] for node in range(graph.num_nodes)], dtype=torch.float32)\n",
    "  cc_feature = cc_feature.view(graph.num_nodes, 1)\n",
    "  graph.node_feature = torch.cat([graph.node_feature, cc_feature], dim=-1)\n",
    "\n",
    "  #########################################\n",
    "\n",
    "root = './cox2'\n",
    "name = 'COX2'\n",
    "pyg_dataset = TUDataset(root, name)\n",
    "graphs = GraphDataset.pyg_to_graphs(pyg_dataset)\n",
    "dataset = GraphDataset(graphs, task='graph')\n",
    "\n",
    "# Transform the dataset\n",
    "dataset.apply_transform(cluster_transform_fn, update_tensor=False)\n",
    "\n",
    "node_idx = 3\n",
    "graph_idx = 406\n",
    "node_feature = dataset[graph_idx].node_feature\n",
    "\n",
    "print(\"The node has clustering coefficient: {}\".format(round(node_feature[node_idx][-1].item(), 2)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "4P5Ig7XaPYzp"
   },
   "source": [
    "Apart from transforming the dataset, DeepSNAP can also transform the graph (usually the `deepsnap.batch.Batch`) during each training iteration.\n",
    "\n",
    "Also, DeepSNAP supports the synchronization of the transformation between the referenced graph objects and tensor representations. For example, you can just update the NetworkX graph object in the transform function, and by specifying `update_tensor=True` the internal tensor representations will be automatically updated.\n",
    "\n",
    "For more information, please refer to the DeepSNAP [documentation](https://snap.stanford.edu/deepsnap/)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "s-YLYMLFQYqp"
   },
   "source": [
    "# 4 Edge Level Prediction\n",
    "\n",
    "From last section, we know how DeepSNAP transductive split the edges in the link prediction task.\n",
    "\n",
    "Now lets use DeepSNAP and PyG together to implement a edge level prediction (link prediction) model!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([ 0,  0,  0,  1,  1,  2,  2,  3,  3,  4,  5,  5,  6,  6,  7,  7,  8,  8,\n",
       "         9,  9, 10, 10, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 18, 18, 18, 19,\n",
       "        19, 19, 22, 22, 22,  1,  4, 18,  2,  6,  3,  5,  4, 23, 24,  7, 11, 12,\n",
       "        16,  8, 25,  9, 26, 10, 19, 11, 27, 28, 13, 29, 14, 30, 15, 17, 16, 31,\n",
       "        32, 33, 34, 35, 20, 21, 22, 36, 37, 38])"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#PRW\n",
    "dataset[0].edge_label_index[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "id": "hrKCNtvERypQ"
   },
   "outputs": [],
   "source": [
    "import copy\n",
    "import torch\n",
    "import numpy as np\n",
    "import networkx as nx\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from deepsnap.graph import Graph\n",
    "from deepsnap.batch import Batch\n",
    "from deepsnap.dataset import GraphDataset\n",
    "from torch_geometric.datasets import Planetoid, TUDataset\n",
    "\n",
    "from torch.utils.data import DataLoader\n",
    "\n",
    "import torch.nn.functional as F\n",
    "from torch_geometric.nn import SAGEConv\n",
    "\n",
    "class LinkPredModel(torch.nn.Module):\n",
    "    def __init__(self, input_dim, hidden_dim, num_classes, dropout=0.2):\n",
    "        super(LinkPredModel, self).__init__()\n",
    "\n",
    "        self.conv1 = SAGEConv(input_dim, hidden_dim)\n",
    "        self.conv2 = SAGEConv(hidden_dim, num_classes)\n",
    "\n",
    "        self.loss_fn = None\n",
    "\n",
    "        ############# Your code here #############\n",
    "        ## (~1 line of code)\n",
    "        ## Note\n",
    "        ## 1. Initialize the loss function to BCEWithLogitsLoss\n",
    "        self.loss_fn=nn.BCEWithLogitsLoss()\n",
    "\n",
    "        ##########################################\n",
    "\n",
    "        self.dropout = dropout\n",
    "\n",
    "    def reset_parameters(self):\n",
    "        self.conv1.reset_parameters()\n",
    "        self.conv2.reset_parameters()\n",
    "\n",
    "    def forward(self, batch):\n",
    "        node_feature, edge_index, edge_label_index = batch.node_feature, batch.edge_index, batch.edge_label_index\n",
    "        \n",
    "        ############# Your code here #############\n",
    "        ## (~6 line of code)\n",
    "        ## Note\n",
    "        ## 1. Feed the node feature into the first conv layer\n",
    "        ## 2. Add a ReLU after the first conv layer\n",
    "        ## 3. Add dropout after the ReLU (with probability self.dropout)\n",
    "        ## 4. Feed the output to the second conv layer\n",
    "        ## 5. Select the embeddings of the source nodes and destination nodes\n",
    "        ## by using the edge_label_index and compute the similarity of each pair\n",
    "        ## by dot product\n",
    "        pred=self.conv1(node_feature,edge_index)\n",
    "        pred=F.relu(pred)\n",
    "        pred=F.dropout(pred,self.dropout,self.training)  #看到有一个答案没加self.training也能抛出结果。啊这，什么玩意啊到底？\n",
    "        pred=self.conv2(pred,edge_index)\n",
    "        #print(pred.size())  torch.Size([2708, 2])\n",
    "        source_nodes=pred[edge_label_index][0]\n",
    "        #print(edge_label_index.size())  torch.Size([2, 3592])\n",
    "        #print(source_nodes.size())  torch.Size([3592, 2])\n",
    "        destination_nodes=pred[edge_label_index][1]\n",
    "        pred=(source_nodes*destination_nodes).sum(axis=1)\n",
    "        \n",
    "        ##########################################\n",
    "\n",
    "        return pred\n",
    "    \n",
    "    def loss(self, pred, link_label):\n",
    "        return self.loss_fn(pred, link_label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([  53, 1848,  552,  ...,  631, 1702, 1183])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#PRW\n",
    "batch.edge_label_index[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "id": "uuKbGFOu1Ka8"
   },
   "outputs": [],
   "source": [
    "from sklearn.metrics import *\n",
    "\n",
    "def train(model, dataloaders, optimizer, args):\n",
    "    val_max = 0\n",
    "    best_model = model\n",
    "\n",
    "    for epoch in range(1, args[\"epochs\"]):\n",
    "        for i, batch in enumerate(dataloaders['train']):\n",
    "            \n",
    "            batch.to(args[\"device\"])\n",
    "\n",
    "            ############# Your code here #############\n",
    "            ## (~6 lines of code)\n",
    "            ## Note\n",
    "            ## 1. Zero grad the optimizer\n",
    "            ## 2. Compute loss and backpropagate\n",
    "            ## 3. Update the model parameters\n",
    "            model.train()  #阿巴阿巴阿巴，我不知道这个是干啥用的，反正我看答案里面写了\n",
    "            optimizer.zero_grad()\n",
    "            p=model(batch)\n",
    "            #print(p.size())  torch.Size([3592])\n",
    "            #print(batch.edge_label.size())  torch.Size([3592])\n",
    "            loss=model.loss(p,batch.edge_label.float())  #第二个参数也可以用type_as(pred))\n",
    "            loss.backward()\n",
    "            optimizer.step()\n",
    "\n",
    "            ##########################################\n",
    "\n",
    "            log = 'Epoch: {:03d}, Train: {:.4f}, Val: {:.4f}, Test: {:.4f}, Loss: {}'\n",
    "            score_train = test(model, dataloaders['train'], args)\n",
    "            score_val = test(model, dataloaders['val'], args)\n",
    "            score_test = test(model, dataloaders['test'], args)\n",
    "\n",
    "            print(log.format(epoch, score_train, score_val, score_test, loss.item()))\n",
    "            if val_max < score_val:\n",
    "                val_max = score_val\n",
    "                best_model = copy.deepcopy(model)\n",
    "    return best_model\n",
    "\n",
    "def test(model, dataloader, args):\n",
    "    model.eval()\n",
    "\n",
    "    score = 0\n",
    "\n",
    "    ############# Your code here #############\n",
    "    ## (~5 lines of code)\n",
    "    ## Note\n",
    "    ## 1. Loop through batches in the dataloader\n",
    "    ## 2. Feed the batch to the model\n",
    "    ## 3. Feed the model output to sigmoid\n",
    "    ## 4. Compute the ROC-AUC score by using sklearn roc_auc_score function\n",
    "    ## 5. Edge labels are stored in batch.edge_label\n",
    "    \n",
    "    for batch in dataloader:  #这个dataloader到底怎么用以后再研究，反正看答案可以这么写\n",
    "        batch.to(args[\"device\"])\n",
    "        p=model(batch)\n",
    "        #print(p.size())  torch.Size([2116])\n",
    "        #p=nn.Sigmoid(p)不知道为啥反正这个不行。看了一下答案改用torch.sigmoid了。以后再研究nn里面这个是怎么回事\n",
    "        p=torch.sigmoid(p)\n",
    "        p=p.cpu().detach().numpy()  #这后面跟的一堆是输出让我这么干的……\n",
    "        label=batch.edge_label.cpu().detach().numpy()\n",
    "        #print(p)\n",
    "        #print(label)\n",
    "        score+=roc_auc_score(label,p)\n",
    "    score=score/len(dataloader)\n",
    "    \n",
    "    ##########################################\n",
    " \n",
    "    return score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(0,\n",
       "  Batch(G=[1], batch=[2708], edge_index=[2, 9498], edge_label=[2116], edge_label_index=[2, 2116], negative_label_val=[1], node_feature=[2708, 1433], node_label=[2708], node_label_index=[2708]))]"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#PRW\n",
    "list(enumerate(dataloaders['test']))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([-1.0730, -1.5740,  2.6048,  ..., -0.7717, -0.1354,  0.0812])\n",
      "tensor([0.2548, 0.1716, 0.9312,  ..., 0.3161, 0.4662, 0.5203])\n"
     ]
    }
   ],
   "source": [
    "#PRW\n",
    "eg_tensor2=torch.randn([2116])\n",
    "print(eg_tensor2)\n",
    "print(torch.sigmoid(eg_tensor2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([-0.0866,  0.4947])\n",
      "tensor([0.4784, 0.6212])\n"
     ]
    }
   ],
   "source": [
    "#PRW\n",
    "m = nn.Sigmoid()\n",
    "input = torch.randn(2)\n",
    "output = m(input)\n",
    "print(input)\n",
    "print(output)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "id": "JTKWYX1b33V3"
   },
   "outputs": [],
   "source": [
    "# Please don't change any parameters\n",
    "args = {\n",
    "    \"device\" : 'cuda' if torch.cuda.is_available() else 'cpu',\n",
    "    \"hidden_dim\" : 128,\n",
    "    \"epochs\" : 200,\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "id": "Klw_xYnE27xQ",
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 001, Train: 0.5569, Val: 0.5409, Test: 0.5429, Loss: 0.6929886937141418\n",
      "Epoch: 002, Train: 0.5555, Val: 0.5412, Test: 0.5430, Loss: 0.6929839253425598\n",
      "Epoch: 003, Train: 0.5550, Val: 0.5418, Test: 0.5433, Loss: 0.6930170655250549\n",
      "Epoch: 004, Train: 0.5577, Val: 0.5424, Test: 0.5434, Loss: 0.692911684513092\n",
      "Epoch: 005, Train: 0.5594, Val: 0.5429, Test: 0.5439, Loss: 0.6930158138275146\n",
      "Epoch: 006, Train: 0.5630, Val: 0.5432, Test: 0.5443, Loss: 0.6929696202278137\n",
      "Epoch: 007, Train: 0.5443, Val: 0.5441, Test: 0.5447, Loss: 0.6929556727409363\n",
      "Epoch: 008, Train: 0.5538, Val: 0.5447, Test: 0.5451, Loss: 0.6929647922515869\n",
      "Epoch: 009, Train: 0.5713, Val: 0.5459, Test: 0.5455, Loss: 0.6929366588592529\n",
      "Epoch: 010, Train: 0.5703, Val: 0.5467, Test: 0.5459, Loss: 0.6929859519004822\n",
      "Epoch: 011, Train: 0.5655, Val: 0.5475, Test: 0.5461, Loss: 0.6929080486297607\n",
      "Epoch: 012, Train: 0.5728, Val: 0.5479, Test: 0.5463, Loss: 0.6929208040237427\n",
      "Epoch: 013, Train: 0.5793, Val: 0.5485, Test: 0.5466, Loss: 0.6929091811180115\n",
      "Epoch: 014, Train: 0.5739, Val: 0.5494, Test: 0.5470, Loss: 0.6929243803024292\n",
      "Epoch: 015, Train: 0.5714, Val: 0.5502, Test: 0.5471, Loss: 0.6929064393043518\n",
      "Epoch: 016, Train: 0.5788, Val: 0.5511, Test: 0.5475, Loss: 0.6928764581680298\n",
      "Epoch: 017, Train: 0.5744, Val: 0.5518, Test: 0.5477, Loss: 0.6928655505180359\n",
      "Epoch: 018, Train: 0.5788, Val: 0.5523, Test: 0.5479, Loss: 0.6928243637084961\n",
      "Epoch: 019, Train: 0.5719, Val: 0.5530, Test: 0.5484, Loss: 0.6928250193595886\n",
      "Epoch: 020, Train: 0.5796, Val: 0.5533, Test: 0.5487, Loss: 0.6928630471229553\n",
      "Epoch: 021, Train: 0.5845, Val: 0.5541, Test: 0.5491, Loss: 0.6927890181541443\n",
      "Epoch: 022, Train: 0.5823, Val: 0.5545, Test: 0.5493, Loss: 0.6928123235702515\n",
      "Epoch: 023, Train: 0.5784, Val: 0.5550, Test: 0.5495, Loss: 0.6927917003631592\n",
      "Epoch: 024, Train: 0.5973, Val: 0.5555, Test: 0.5496, Loss: 0.6927290558815002\n",
      "Epoch: 025, Train: 0.5884, Val: 0.5558, Test: 0.5498, Loss: 0.6927274465560913\n",
      "Epoch: 026, Train: 0.5982, Val: 0.5561, Test: 0.5500, Loss: 0.6926369667053223\n",
      "Epoch: 027, Train: 0.5820, Val: 0.5567, Test: 0.5502, Loss: 0.6925781965255737\n",
      "Epoch: 028, Train: 0.5928, Val: 0.5573, Test: 0.5503, Loss: 0.6926374435424805\n",
      "Epoch: 029, Train: 0.5932, Val: 0.5575, Test: 0.5505, Loss: 0.6926783323287964\n",
      "Epoch: 030, Train: 0.5962, Val: 0.5578, Test: 0.5508, Loss: 0.6926188468933105\n",
      "Epoch: 031, Train: 0.6079, Val: 0.5580, Test: 0.5512, Loss: 0.6925864219665527\n",
      "Epoch: 032, Train: 0.6041, Val: 0.5580, Test: 0.5515, Loss: 0.6925614476203918\n",
      "Epoch: 033, Train: 0.6032, Val: 0.5577, Test: 0.5518, Loss: 0.6923878788948059\n",
      "Epoch: 034, Train: 0.6021, Val: 0.5575, Test: 0.5522, Loss: 0.6924198269844055\n",
      "Epoch: 035, Train: 0.5998, Val: 0.5573, Test: 0.5525, Loss: 0.6924680471420288\n",
      "Epoch: 036, Train: 0.5956, Val: 0.5577, Test: 0.5528, Loss: 0.6924338340759277\n",
      "Epoch: 037, Train: 0.6125, Val: 0.5574, Test: 0.5534, Loss: 0.6923313736915588\n",
      "Epoch: 038, Train: 0.6162, Val: 0.5577, Test: 0.5540, Loss: 0.6922208070755005\n",
      "Epoch: 039, Train: 0.6159, Val: 0.5575, Test: 0.5548, Loss: 0.6921758055686951\n",
      "Epoch: 040, Train: 0.6129, Val: 0.5574, Test: 0.5555, Loss: 0.6921308636665344\n",
      "Epoch: 041, Train: 0.6198, Val: 0.5575, Test: 0.5561, Loss: 0.6920880079269409\n",
      "Epoch: 042, Train: 0.6105, Val: 0.5580, Test: 0.5571, Loss: 0.6920261383056641\n",
      "Epoch: 043, Train: 0.6127, Val: 0.5583, Test: 0.5581, Loss: 0.6917962431907654\n",
      "Epoch: 044, Train: 0.6180, Val: 0.5585, Test: 0.5593, Loss: 0.6918795704841614\n",
      "Epoch: 045, Train: 0.6193, Val: 0.5589, Test: 0.5601, Loss: 0.6918977499008179\n",
      "Epoch: 046, Train: 0.6229, Val: 0.5587, Test: 0.5613, Loss: 0.6917514204978943\n",
      "Epoch: 047, Train: 0.6301, Val: 0.5588, Test: 0.5625, Loss: 0.6916201710700989\n",
      "Epoch: 048, Train: 0.6313, Val: 0.5591, Test: 0.5636, Loss: 0.6916443109512329\n",
      "Epoch: 049, Train: 0.6259, Val: 0.5598, Test: 0.5648, Loss: 0.6914628148078918\n",
      "Epoch: 050, Train: 0.6173, Val: 0.5603, Test: 0.5661, Loss: 0.6915557980537415\n",
      "Epoch: 051, Train: 0.6270, Val: 0.5611, Test: 0.5673, Loss: 0.6912547945976257\n",
      "Epoch: 052, Train: 0.6263, Val: 0.5613, Test: 0.5685, Loss: 0.690937340259552\n",
      "Epoch: 053, Train: 0.6382, Val: 0.5622, Test: 0.5696, Loss: 0.6909784078598022\n",
      "Epoch: 054, Train: 0.6361, Val: 0.5627, Test: 0.5708, Loss: 0.6908580660820007\n",
      "Epoch: 055, Train: 0.6319, Val: 0.5630, Test: 0.5723, Loss: 0.6913658976554871\n",
      "Epoch: 056, Train: 0.6339, Val: 0.5641, Test: 0.5737, Loss: 0.6907703876495361\n",
      "Epoch: 057, Train: 0.6322, Val: 0.5650, Test: 0.5748, Loss: 0.6902065277099609\n",
      "Epoch: 058, Train: 0.6357, Val: 0.5659, Test: 0.5760, Loss: 0.6903655529022217\n",
      "Epoch: 059, Train: 0.6470, Val: 0.5667, Test: 0.5772, Loss: 0.6900197863578796\n",
      "Epoch: 060, Train: 0.6505, Val: 0.5674, Test: 0.5784, Loss: 0.6900460720062256\n",
      "Epoch: 061, Train: 0.6404, Val: 0.5678, Test: 0.5796, Loss: 0.6898162961006165\n",
      "Epoch: 062, Train: 0.6355, Val: 0.5688, Test: 0.5807, Loss: 0.6897856593132019\n",
      "Epoch: 063, Train: 0.6346, Val: 0.5693, Test: 0.5817, Loss: 0.6893499493598938\n",
      "Epoch: 064, Train: 0.6453, Val: 0.5698, Test: 0.5829, Loss: 0.6891196966171265\n",
      "Epoch: 065, Train: 0.6495, Val: 0.5704, Test: 0.5839, Loss: 0.6888810992240906\n",
      "Epoch: 066, Train: 0.6449, Val: 0.5714, Test: 0.5850, Loss: 0.6885324716567993\n",
      "Epoch: 067, Train: 0.6393, Val: 0.5723, Test: 0.5860, Loss: 0.6879283785820007\n",
      "Epoch: 068, Train: 0.6521, Val: 0.5733, Test: 0.5870, Loss: 0.6879096627235413\n",
      "Epoch: 069, Train: 0.6488, Val: 0.5743, Test: 0.5878, Loss: 0.6878958940505981\n",
      "Epoch: 070, Train: 0.6466, Val: 0.5751, Test: 0.5888, Loss: 0.6875074505805969\n",
      "Epoch: 071, Train: 0.6611, Val: 0.5763, Test: 0.5899, Loss: 0.6873077154159546\n",
      "Epoch: 072, Train: 0.6461, Val: 0.5774, Test: 0.5909, Loss: 0.6864189505577087\n",
      "Epoch: 073, Train: 0.6601, Val: 0.5786, Test: 0.5921, Loss: 0.6860195994377136\n",
      "Epoch: 074, Train: 0.6675, Val: 0.5805, Test: 0.5933, Loss: 0.686062753200531\n",
      "Epoch: 075, Train: 0.6606, Val: 0.5816, Test: 0.5945, Loss: 0.6846186518669128\n",
      "Epoch: 076, Train: 0.6462, Val: 0.5825, Test: 0.5957, Loss: 0.6845111846923828\n",
      "Epoch: 077, Train: 0.6635, Val: 0.5838, Test: 0.5970, Loss: 0.684226930141449\n",
      "Epoch: 078, Train: 0.6551, Val: 0.5854, Test: 0.5985, Loss: 0.6833392381668091\n",
      "Epoch: 079, Train: 0.6623, Val: 0.5863, Test: 0.5996, Loss: 0.681663453578949\n",
      "Epoch: 080, Train: 0.6571, Val: 0.5878, Test: 0.6011, Loss: 0.6825706958770752\n",
      "Epoch: 081, Train: 0.6639, Val: 0.5894, Test: 0.6029, Loss: 0.6813477277755737\n",
      "Epoch: 082, Train: 0.6625, Val: 0.5909, Test: 0.6045, Loss: 0.6793225407600403\n",
      "Epoch: 083, Train: 0.6696, Val: 0.5926, Test: 0.6064, Loss: 0.6797640323638916\n",
      "Epoch: 084, Train: 0.6691, Val: 0.5951, Test: 0.6089, Loss: 0.6787273287773132\n",
      "Epoch: 085, Train: 0.6714, Val: 0.5982, Test: 0.6119, Loss: 0.677528440952301\n",
      "Epoch: 086, Train: 0.6781, Val: 0.6012, Test: 0.6155, Loss: 0.6754906177520752\n",
      "Epoch: 087, Train: 0.6835, Val: 0.6045, Test: 0.6199, Loss: 0.6742434501647949\n",
      "Epoch: 088, Train: 0.6876, Val: 0.6089, Test: 0.6250, Loss: 0.674199104309082\n",
      "Epoch: 089, Train: 0.6865, Val: 0.6144, Test: 0.6310, Loss: 0.6722720861434937\n",
      "Epoch: 090, Train: 0.6861, Val: 0.6206, Test: 0.6377, Loss: 0.669204831123352\n",
      "Epoch: 091, Train: 0.6951, Val: 0.6270, Test: 0.6446, Loss: 0.6651440858840942\n",
      "Epoch: 092, Train: 0.6992, Val: 0.6333, Test: 0.6513, Loss: 0.6654133200645447\n",
      "Epoch: 093, Train: 0.7082, Val: 0.6400, Test: 0.6589, Loss: 0.6633010506629944\n",
      "Epoch: 094, Train: 0.7020, Val: 0.6472, Test: 0.6667, Loss: 0.6615661978721619\n",
      "Epoch: 095, Train: 0.7284, Val: 0.6554, Test: 0.6750, Loss: 0.6599288582801819\n",
      "Epoch: 096, Train: 0.7294, Val: 0.6631, Test: 0.6825, Loss: 0.6568361520767212\n",
      "Epoch: 097, Train: 0.7344, Val: 0.6683, Test: 0.6879, Loss: 0.6523090600967407\n",
      "Epoch: 098, Train: 0.7353, Val: 0.6730, Test: 0.6938, Loss: 0.6540626883506775\n",
      "Epoch: 099, Train: 0.7384, Val: 0.6771, Test: 0.6971, Loss: 0.6465598940849304\n",
      "Epoch: 100, Train: 0.7369, Val: 0.6784, Test: 0.6992, Loss: 0.6397441029548645\n",
      "Epoch: 101, Train: 0.7481, Val: 0.6795, Test: 0.7003, Loss: 0.6376416087150574\n",
      "Epoch: 102, Train: 0.7460, Val: 0.6812, Test: 0.7019, Loss: 0.6376039981842041\n",
      "Epoch: 103, Train: 0.7427, Val: 0.6832, Test: 0.7036, Loss: 0.63442063331604\n",
      "Epoch: 104, Train: 0.7518, Val: 0.6834, Test: 0.7047, Loss: 0.6209152936935425\n",
      "Epoch: 105, Train: 0.7406, Val: 0.6837, Test: 0.7061, Loss: 0.6204434633255005\n",
      "Epoch: 106, Train: 0.7382, Val: 0.6839, Test: 0.7073, Loss: 0.62674480676651\n",
      "Epoch: 107, Train: 0.7532, Val: 0.6842, Test: 0.7075, Loss: 0.6220774054527283\n",
      "Epoch: 108, Train: 0.7540, Val: 0.6844, Test: 0.7082, Loss: 0.6155555248260498\n",
      "Epoch: 109, Train: 0.7456, Val: 0.6854, Test: 0.7098, Loss: 0.6229535341262817\n",
      "Epoch: 110, Train: 0.7676, Val: 0.6859, Test: 0.7109, Loss: 0.6287565231323242\n",
      "Epoch: 111, Train: 0.7456, Val: 0.6866, Test: 0.7121, Loss: 0.6160032749176025\n",
      "Epoch: 112, Train: 0.7385, Val: 0.6874, Test: 0.7133, Loss: 0.6070438623428345\n",
      "Epoch: 113, Train: 0.7557, Val: 0.6876, Test: 0.7146, Loss: 0.6178596615791321\n",
      "Epoch: 114, Train: 0.7610, Val: 0.6891, Test: 0.7171, Loss: 0.6093465685844421\n",
      "Epoch: 115, Train: 0.7673, Val: 0.6910, Test: 0.7215, Loss: 0.6013707518577576\n",
      "Epoch: 116, Train: 0.7816, Val: 0.6918, Test: 0.7248, Loss: 0.6063439846038818\n",
      "Epoch: 117, Train: 0.7828, Val: 0.6931, Test: 0.7273, Loss: 0.6050513386726379\n",
      "Epoch: 118, Train: 0.7778, Val: 0.6941, Test: 0.7286, Loss: 0.5997897982597351\n",
      "Epoch: 119, Train: 0.7876, Val: 0.6954, Test: 0.7302, Loss: 0.5917118191719055\n",
      "Epoch: 120, Train: 0.7869, Val: 0.6969, Test: 0.7320, Loss: 0.6024981737136841\n",
      "Epoch: 121, Train: 0.7926, Val: 0.6985, Test: 0.7340, Loss: 0.6046048402786255\n",
      "Epoch: 122, Train: 0.7994, Val: 0.7003, Test: 0.7360, Loss: 0.5851894617080688\n",
      "Epoch: 123, Train: 0.7982, Val: 0.7018, Test: 0.7376, Loss: 0.5919445157051086\n",
      "Epoch: 124, Train: 0.7909, Val: 0.7032, Test: 0.7390, Loss: 0.5812060236930847\n",
      "Epoch: 125, Train: 0.8006, Val: 0.7036, Test: 0.7389, Loss: 0.5891010761260986\n",
      "Epoch: 126, Train: 0.7999, Val: 0.7051, Test: 0.7399, Loss: 0.5911628603935242\n",
      "Epoch: 127, Train: 0.8039, Val: 0.7075, Test: 0.7416, Loss: 0.5824114680290222\n",
      "Epoch: 128, Train: 0.8092, Val: 0.7096, Test: 0.7425, Loss: 0.5835140943527222\n",
      "Epoch: 129, Train: 0.8108, Val: 0.7106, Test: 0.7432, Loss: 0.5842667818069458\n",
      "Epoch: 130, Train: 0.8241, Val: 0.7114, Test: 0.7434, Loss: 0.5840399265289307\n",
      "Epoch: 131, Train: 0.8133, Val: 0.7101, Test: 0.7413, Loss: 0.5727593898773193\n",
      "Epoch: 132, Train: 0.8119, Val: 0.7091, Test: 0.7386, Loss: 0.5762728452682495\n",
      "Epoch: 133, Train: 0.8215, Val: 0.7100, Test: 0.7390, Loss: 0.5738840103149414\n",
      "Epoch: 134, Train: 0.8183, Val: 0.7128, Test: 0.7416, Loss: 0.5668927431106567\n",
      "Epoch: 135, Train: 0.8298, Val: 0.7155, Test: 0.7443, Loss: 0.5744336843490601\n",
      "Epoch: 136, Train: 0.8271, Val: 0.7167, Test: 0.7447, Loss: 0.5708880424499512\n",
      "Epoch: 137, Train: 0.8255, Val: 0.7164, Test: 0.7440, Loss: 0.5716730952262878\n",
      "Epoch: 138, Train: 0.8294, Val: 0.7131, Test: 0.7402, Loss: 0.5643101930618286\n",
      "Epoch: 139, Train: 0.8390, Val: 0.7128, Test: 0.7395, Loss: 0.566378116607666\n",
      "Epoch: 140, Train: 0.8328, Val: 0.7169, Test: 0.7433, Loss: 0.5661064386367798\n",
      "Epoch: 141, Train: 0.8378, Val: 0.7213, Test: 0.7473, Loss: 0.5604500770568848\n",
      "Epoch: 142, Train: 0.8432, Val: 0.7229, Test: 0.7487, Loss: 0.5661085844039917\n",
      "Epoch: 143, Train: 0.8436, Val: 0.7234, Test: 0.7493, Loss: 0.5603146553039551\n",
      "Epoch: 144, Train: 0.8422, Val: 0.7229, Test: 0.7488, Loss: 0.553178071975708\n",
      "Epoch: 145, Train: 0.8530, Val: 0.7213, Test: 0.7482, Loss: 0.563292384147644\n",
      "Epoch: 146, Train: 0.8599, Val: 0.7215, Test: 0.7481, Loss: 0.5545362234115601\n",
      "Epoch: 147, Train: 0.8570, Val: 0.7257, Test: 0.7514, Loss: 0.5544596910476685\n",
      "Epoch: 148, Train: 0.8552, Val: 0.7283, Test: 0.7530, Loss: 0.5546279549598694\n",
      "Epoch: 149, Train: 0.8659, Val: 0.7280, Test: 0.7530, Loss: 0.5476570129394531\n",
      "Epoch: 150, Train: 0.8498, Val: 0.7251, Test: 0.7510, Loss: 0.5520760416984558\n",
      "Epoch: 151, Train: 0.8588, Val: 0.7212, Test: 0.7472, Loss: 0.5390874743461609\n",
      "Epoch: 152, Train: 0.8573, Val: 0.7211, Test: 0.7472, Loss: 0.549604594707489\n",
      "Epoch: 153, Train: 0.8616, Val: 0.7258, Test: 0.7511, Loss: 0.5429971814155579\n",
      "Epoch: 154, Train: 0.8641, Val: 0.7302, Test: 0.7540, Loss: 0.543861985206604\n",
      "Epoch: 155, Train: 0.8631, Val: 0.7302, Test: 0.7545, Loss: 0.5437316298484802\n",
      "Epoch: 156, Train: 0.8643, Val: 0.7288, Test: 0.7531, Loss: 0.5418906807899475\n",
      "Epoch: 157, Train: 0.8681, Val: 0.7245, Test: 0.7487, Loss: 0.5379639267921448\n",
      "Epoch: 158, Train: 0.8718, Val: 0.7228, Test: 0.7472, Loss: 0.5382258892059326\n",
      "Epoch: 159, Train: 0.8666, Val: 0.7252, Test: 0.7493, Loss: 0.5342247486114502\n",
      "Epoch: 160, Train: 0.8791, Val: 0.7294, Test: 0.7532, Loss: 0.533492386341095\n",
      "Epoch: 161, Train: 0.8705, Val: 0.7284, Test: 0.7526, Loss: 0.5476093888282776\n",
      "Epoch: 162, Train: 0.8778, Val: 0.7283, Test: 0.7526, Loss: 0.5349440574645996\n",
      "Epoch: 163, Train: 0.8663, Val: 0.7260, Test: 0.7508, Loss: 0.5389660596847534\n",
      "Epoch: 164, Train: 0.8722, Val: 0.7237, Test: 0.7485, Loss: 0.5275857448577881\n",
      "Epoch: 165, Train: 0.8747, Val: 0.7237, Test: 0.7485, Loss: 0.5451138019561768\n",
      "Epoch: 166, Train: 0.8746, Val: 0.7294, Test: 0.7528, Loss: 0.542015016078949\n",
      "Epoch: 167, Train: 0.8761, Val: 0.7340, Test: 0.7560, Loss: 0.5289369821548462\n",
      "Epoch: 168, Train: 0.8859, Val: 0.7335, Test: 0.7556, Loss: 0.5313538312911987\n",
      "Epoch: 169, Train: 0.8870, Val: 0.7298, Test: 0.7523, Loss: 0.5311650037765503\n",
      "Epoch: 170, Train: 0.8868, Val: 0.7261, Test: 0.7488, Loss: 0.5373271107673645\n",
      "Epoch: 171, Train: 0.8816, Val: 0.7240, Test: 0.7471, Loss: 0.5164431929588318\n",
      "Epoch: 172, Train: 0.8798, Val: 0.7281, Test: 0.7511, Loss: 0.5216556787490845\n",
      "Epoch: 173, Train: 0.8908, Val: 0.7334, Test: 0.7555, Loss: 0.5265358090400696\n",
      "Epoch: 174, Train: 0.8880, Val: 0.7356, Test: 0.7572, Loss: 0.529121458530426\n",
      "Epoch: 175, Train: 0.8820, Val: 0.7345, Test: 0.7563, Loss: 0.5107264518737793\n",
      "Epoch: 176, Train: 0.8937, Val: 0.7311, Test: 0.7532, Loss: 0.5251190066337585\n",
      "Epoch: 177, Train: 0.8881, Val: 0.7252, Test: 0.7479, Loss: 0.5174374580383301\n",
      "Epoch: 178, Train: 0.8970, Val: 0.7245, Test: 0.7466, Loss: 0.5194377303123474\n",
      "Epoch: 179, Train: 0.8952, Val: 0.7317, Test: 0.7532, Loss: 0.525752067565918\n",
      "Epoch: 180, Train: 0.9016, Val: 0.7359, Test: 0.7565, Loss: 0.5239531397819519\n",
      "Epoch: 181, Train: 0.8923, Val: 0.7339, Test: 0.7541, Loss: 0.5162546634674072\n",
      "Epoch: 182, Train: 0.9012, Val: 0.7322, Test: 0.7520, Loss: 0.5149680972099304\n",
      "Epoch: 183, Train: 0.8971, Val: 0.7312, Test: 0.7507, Loss: 0.5195671916007996\n",
      "Epoch: 184, Train: 0.9018, Val: 0.7334, Test: 0.7531, Loss: 0.5078951716423035\n",
      "Epoch: 185, Train: 0.9012, Val: 0.7356, Test: 0.7547, Loss: 0.517343282699585\n",
      "Epoch: 186, Train: 0.9018, Val: 0.7352, Test: 0.7548, Loss: 0.51859450340271\n",
      "Epoch: 187, Train: 0.9082, Val: 0.7307, Test: 0.7510, Loss: 0.5130800008773804\n",
      "Epoch: 188, Train: 0.9069, Val: 0.7311, Test: 0.7507, Loss: 0.5072763562202454\n",
      "Epoch: 189, Train: 0.9054, Val: 0.7338, Test: 0.7523, Loss: 0.5078652501106262\n",
      "Epoch: 190, Train: 0.9021, Val: 0.7320, Test: 0.7502, Loss: 0.5095203518867493\n",
      "Epoch: 191, Train: 0.9000, Val: 0.7292, Test: 0.7470, Loss: 0.5072373151779175\n",
      "Epoch: 192, Train: 0.9098, Val: 0.7315, Test: 0.7496, Loss: 0.5207746624946594\n",
      "Epoch: 193, Train: 0.9124, Val: 0.7352, Test: 0.7540, Loss: 0.5204772353172302\n",
      "Epoch: 194, Train: 0.9121, Val: 0.7364, Test: 0.7563, Loss: 0.5060431957244873\n",
      "Epoch: 195, Train: 0.9127, Val: 0.7314, Test: 0.7527, Loss: 0.5067796111106873\n",
      "Epoch: 196, Train: 0.9074, Val: 0.7254, Test: 0.7484, Loss: 0.5065529942512512\n",
      "Epoch: 197, Train: 0.9099, Val: 0.7270, Test: 0.7487, Loss: 0.5093963742256165\n",
      "Epoch: 198, Train: 0.9182, Val: 0.7378, Test: 0.7557, Loss: 0.4952718913555145\n",
      "Epoch: 199, Train: 0.9169, Val: 0.7419, Test: 0.7571, Loss: 0.4918716549873352\n",
      "Train: 0.9134, Val: 0.7419, Test: 0.7571\n"
     ]
    }
   ],
   "source": [
    "pyg_dataset = Planetoid('./tmp/cora', 'Cora')\n",
    "graphs = GraphDataset.pyg_to_graphs(pyg_dataset)\n",
    "\n",
    "dataset = GraphDataset(\n",
    "        graphs,\n",
    "        task='link_pred',\n",
    "        edge_train_mode=\"disjoint\"\n",
    "    )\n",
    "datasets = {}\n",
    "datasets['train'], datasets['val'], datasets['test']= dataset.split(\n",
    "            transductive=True, split_ratio=[0.85, 0.05, 0.1])\n",
    "input_dim = datasets['train'].num_node_features\n",
    "num_classes = datasets['train'].num_edge_labels\n",
    "\n",
    "model = LinkPredModel(input_dim, args[\"hidden_dim\"], num_classes).to(args[\"device\"])\n",
    "model.reset_parameters()\n",
    "\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9, weight_decay=5e-4)\n",
    "\n",
    "dataloaders = {split: DataLoader(\n",
    "            ds, collate_fn=Batch.collate([]),\n",
    "            batch_size=1, shuffle=(split=='train'))\n",
    "            for split, ds in datasets.items()}\n",
    "best_model = train(model, dataloaders, optimizer, args)\n",
    "log = \"Train: {:.4f}, Val: {:.4f}, Test: {:.4f}\"\n",
    "best_train_roc = test(best_model, dataloaders['train'], args)\n",
    "best_val_roc = test(best_model, dataloaders['val'], args)\n",
    "best_test_roc = test(best_model, dataloaders['test'], args)\n",
    "print(log.format(best_train_roc, best_val_roc, best_test_roc))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "j5brlsKElP0_"
   },
   "source": [
    "## Question 4: What is the maximum ROC-AUC score you could get for the best_model on test set? (13 points)\n",
    "\n",
    "Submit your answers on Gradescope."
   ]
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "collapsed_sections": [],
   "machine_shape": "hm",
   "name": "CS224W - Colab 3.ipynb",
   "provenance": [],
   "toc_visible": true
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
